我读了很多帖子,发现 JS 正则表达式似乎不支持look-behind
。有没有办法我仍然可以排除匹配的部分,即任何相等的符号,前面或后面有任意数量的空格?
到目前为止,我得到的是s+|,|(|)|(?! s*?=)
这个正则表达式将匹配所有分隔符,如任意数量的空格",","("或"(",但在我想排除在=
符号之前或之后找到的任何空格的最后一部分无法正常工作。
所以我做(?! s*?=)
的那一刻就是所有地狱爆发的时候。但是,我可以看到,如果我只是将s*?=
与管道一起使用,它实际上与any equal symbols with any number of spaces in front or after it
匹配。
沙盒:https://regexr.com/4fgop
有没有办法我仍然可以在javascript中做到这一点?
示例(通过将正则表达式与STRING.split(regexrulehere)
一起使用(
输入字符串: my-app command, arg1 arg2 arg3 =val1, arg4 = val2)
预期输出:
[
'my-app',
'command',
'arg1',
'arg2',
'arg3=val1', // or `arg3 =val1` is fine as well
'arg4=val2', // or `arg4 = val2` is fine as well
]
字符串中=
周围有空格,并且不能期望在单个split
后获得arg4=val2
(没有空格(。
分两个"正则表达式"步骤完成:
s = s.replace(/s*=s*/g, '=').match(/[^s,()]+/g)
该s*=s*
匹配任何 0+ 空格、=
和 0+ 空格,此replace
删除=
周围的所有空格。 .match(/[^s,()]+/g)
将提取除空格、,
、(
和)
字符以外的所有 1+ 字符块,因为[^...]
是一个否定的字符类。
JS演示:
var s = "my-app command, arg1 arg2 arg3=val1, arg4=val2)";
console.log(s.replace(/s*=s*/g, '=').match(/[^s,()]+/g));
如果要拆分,请使用
s.replace(/s*=s*/g, '=').split(/[s,()]+/).filter(Boolean)
请注意,删除空元素(如果有(需要filter(Boolean)
。
正如您所说,包括空格字符也可以,另一种选择可能是不使用否定字符类[^s(),=]+
匹配括号、逗号、等号或空格字符。
然后在匹配后跟一个可选部分(?:....)?
该部分匹配由空格字符包围的等号,并再次使用否定字符类:
[^s(),=]+(?:s*=s*[^s(),=]+)?
正则表达式演示