代码之家  ›  专栏  ›  技术社区  ›  Lauri Oherd

如何使用javascript regex搜索csv字符串并返回匹配项

  •  0
  • Lauri Oherd  · 技术社区  · 15 年前

    我试图从匹配模式的分号分隔字符串中提取第一个用户权限。

    用户权限以以下格式存储: LAA;LA_1;LA_2;LE_3;

    如果用户没有任何权限,则字符串为空。

    到目前为止,我最好的解决方案是在regex.replace语句中使用以下regex: .*?;(LA_[^;]*)?.*

    (组末的问号是为了在用户没有权利的情况下匹配整行,并用空字符串替换它以表示她没有权利。)

    但是,如果搜索到的权限位于第一个位置,则无法正常工作: LA_1;LA_2;LE_3;

    在regex替换之前,只需在行首添加分号就可以很容易地修复它,但我的问题是,为什么下面的regex不匹配它呢?

    .*?(?:(?:^|;)(LA_[^;]*))?.*

    我尝试过许多其他的正则表达式来寻找解决方案,但到目前为止还没有成功。

    3 回复  |  直到 15 年前
        1
  •  0
  •   Sinan Taifour    15 年前

    我不确定你的问题是否正确,但是关于你使用的正则表达式,你没有明确的理由(至少对我来说不是这样)将它们过度复杂化了。您可能需要这样的东西:

    function getFirstRight(rights) {
      var m = rights.match(/(^|;)(LA_[^;]*)/)
      return m ? m[2] : "";
    }
    
        2
  •  0
  •   Joel Coehoorn    15 年前

    您可以先拆分字符串:

    function getFirstRight(rights)
    {
        return rights.split(";",1)[0] || "";
    }
    
        3
  •  0
  •   epost    15 年前

    回答特定的问题“为什么下面的regex不匹配?”一个问题是在开始时混合了这一点:

    .*?
    

    最后是:

    ^|;
    

    这可能类似于说,跳过任何额外的字符,直到到达开头或分号。但不能跳过任何内容,然后到达开始处(除非它在多行字符串中包含换行符)。

    类似这样的工作:

    .*?(\bLA_[^;]).*
    

    意思是,跳过字符,直到单词边界后跟“la_uuu”。