Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/434.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 正则表达式匹配逗号分隔字符串_Javascript_Regex - Fatal编程技术网

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]}
可以在没有任何regex
text.split(',').map(v=>v.trim().slice(0,-1)。split('('))
取决于
value
的内容。但我喜欢regex::(@bflemi3 Less regExp=>更快的代码;)。Less regex更具可读性和可维护性。而且你不需要擅长正则表达式。:)为什么不在拆分器中也包括括号?(
/\(\124;\),\ s+/
)@Teemu我不明白你为什么要这样做。想用一个工作片段构建一个解决方案吗?简化:提供的数据本身当然不包含逗号或父项。@Teemu看看问题中的期望结果这不会生成OP所需的两级数组。如果你只需要一个正则表达式,你需要使用exec和一个循环。很好。我已经有一段时间没有在Javascript中使用RegExp了。我将更新我的答案。