如何使用Javascript正则表达式搜索csv字符串并返回匹配项
-
05-07-2019 - |
题
我正在尝试从与分号匹配的分号分隔字符串中提取第一个用户权限。
用户权限以以下格式存储: <代码> LAA; LA_1; LA_2; LE_3; 代码>
如果用户没有任何权限,则字符串为空。
到目前为止,我最好的解决方案是在regex.replace语句中使用以下正则表达式: <代码> * ?;(LA _ [^] *)?* 代码>
(组末尾的问号是为了匹配整行,以防用户没有权利,并用空字符串替换它以表明她没有它。)
但是,如果搜索到的权限位于第一个位置,它将无法正常工作: <代码> LA_1; LA_2; LE_3; 代码>
通过在正则表达式替换之前在行的开头添加分号很容易修复它,但我的问题是,为什么以下正则表达式不匹配呢?
<代码> *(:(:?^ |)(LA _ [^] *))。?。* 代码>
我已经尝试了许多其他正则表达式来找到解决方案,但到目前为止还没有成功。
解决方案
我不确定我的问题是否正确,但对于您正在使用的正则表达式,您没有明确的理由(至少不是我)使它们过于复杂。您可能需要以下内容:
function getFirstRight(rights) {
var m = rights.match(/(^|;)(LA_[^;]*)/)
return m ? m[2] : "";
}
其他提示
你可以先拆分字符串:
function getFirstRight(rights)
{
return rights.split(";",1)[0] || "";
}
要回答具体问题“为什么以下的正则表达不匹配?”,一个问题是开头的混合:
.*?
最终紧接着:
^|;
可能就像说,跳过任何多余的字符,直到你到达开头或分号。但你不能跳过任何东西然后到达开头(除非它涉及多行字符串中的换行符)。
这样的工作:
.*?(\bLA_[^;]).*
含义,跳过字符,直到单词边界后跟“LA_”。
不隶属于 StackOverflow