Javascript 正则表达式匹配逗号分隔字符串
给定以下任意字符串,其中运算符和值仅为占位符:Javascript 正则表达式匹配逗号分隔字符串,javascript,regex,Javascript,Regex,给定以下任意字符串,其中运算符和值仅为占位符: "operator1(value)" "operator1(value), operator2(value)" "operator1(value), operator2(value), operator_n(value)" 我需要能够匹配,以便我可以得到每个运算符及其值,如下所示: [[operator1, value]] [[operator1, value], [operator2, value]] [[operator1, value],
"operator1(value)"
"operator1(value), operator2(value)"
"operator1(value), operator2(value), operator_n(value)"
我需要能够匹配,以便我可以得到每个运算符及其值,如下所示:
[[operator1, value]]
[[operator1, value], [operator2, value]]
[[operator1, value], [operator2, value], [operator_n, value]]
请注意:给定字符串中可能有n个运算符(逗号分隔)
我当前的尝试将与运算符1(值)
匹配,但与多个运算符不匹配。有关结果,请参阅
/^(.*?)\((.*)\)$/
可以通过先拆分,然后使用正则表达式来执行此操作:
[
“运算符1(值)”,
“运算符1(值)、运算符2(值)”,
运算符1(值)、运算符2(值)、运算符n(值)
].forEach((str)=>{
var结果=str
.split(/[,\s]+/)//拆分操作
.map(s=>s.match(/(\w+)\(\w+)\/)//提取部分操作
.filter(布尔)//确保没有错误(在输入不纯的情况下)
.map(s=>s.slice(1));//生成所需的结果
控制台日志(结果);
});代码>您应该能够使用一个使用全局标志的正则表达式来实现这一点
var re= /(?:,\s*)?([^(]+?)\(([^)]+)\)/g;
var results = re.exec(str);
查看Regex 101的结果:这是对这个问题的一个纯Regex答案,只要变量总是用a分隔,并且一个空格应该穿过行而没有太多问题,这就行了
https://regex101.com/r/eC3uK3/4
([^\(]*)(\([^, ]*\))(?:, )?(?:\n)?
Matches on:
operator1(value), operator2(value), operator_n(value),
operator1(value), operator2(value)
说明:
因此,这将设置2个捕获组和2个非捕获组
第一个捕获组将匹配一个值名,直到有一个括号为止(通过使用否定集和贪婪)。第二个捕获组将获取括号和值名称,直到找到括号的结尾(注意,您可以通过转义括号的外部集合而不是内部集合(此处的示例:)来摆脱括号。非捕获组中有一个可选的“,”和一个可选的“\n”在另一个非捕获组中处理您可能遇到的任何换行符
这应将您的数据分为:
'Operator1'
'(value)'
'operator2'
'(value)'
这也可以通过一个简单的拆分和一个For
循环来完成
var data=“运算符1(值)、运算符2(值)、运算符n(值)”,
ops=data.substring(0,data.length-1),//从字符串中删除最后一个parenth
arr=操作拆分(/\(|\),/),
res=[],n,eN=arr.length;
对于(n=0;n
以下函数“check”将实现您想要的功能,如果您想要字符串而不是结果数组,只需对函数返回的数组使用.toString()
方法即可
功能检查(str){
var myRe=/([^(,\s]*)\([^)]*)\(g;
var-myArray;
var结果=[];
while((myArray=myRe.exec(str))!==null){
push(`[${myArray[1]},${myArray[2]}]`);
};
返回结果;
}
var check1=检查(“运算符1(值)”;
控制台日志(“检查1”,检查1);
var check2=检查(“运算符1(值)、运算符2(值)”;
控制台日志(“检查2”,检查2);
var check3=检查(“运算符1(值)、运算符2(值)、运算符n(值)”;
console.log(“check3”,check3);
str.split(',').map(x=>{var y=x.match(/(.*?)\(.*?)/);return[y[1],y[2]}
可以在没有任何regextext.split(',').map(v=>v.trim().slice(0,-1)。split('('))
取决于value
的内容。但我喜欢regex::(@bflemi3 Less regExp=>更快的代码;)。Less regex更具可读性和可维护性。而且你不需要擅长正则表达式。:)为什么不在拆分器中也包括括号?(/\(\124;\),\ s+/
)@Teemu我不明白你为什么要这样做。想用一个工作片段构建一个解决方案吗?简化:提供的数据本身当然不包含逗号或父项。@Teemu看看问题中的期望结果这不会生成OP所需的两级数组。如果你只需要一个正则表达式,你需要使用exec和一个循环。很好。我已经有一段时间没有在Javascript中使用RegExp了。我将更新我的答案。