如何编写与多个分隔符匹配的正则表达式命令,这些分隔符包括任意数量的空格,但不等于等号之间的空格?

时间:2019-06-10 06:43:11

标签: javascript regex

我阅读了许多帖子,发现JS regex不支持look-behind。我是否仍可以通过这种方式来排除匹配项,该匹配项是等于或等于或等于或等于或等于或等于的符号?

到目前为止,我得到的是\s+|,|\(|\)|(?! \s*?=) 此正则表达式将匹配所有分隔符,例如任意数量的空格“,”,“(”或“)”,但不适用于我要排除{{1之前或之后的所有空格的最后一部分}}符号。

所以我做=的那一刻,就是地狱爆发。但是,我可以看到,如果仅将(?! \s*?=)与管道一起使用,则它实际上与\s*?=相匹配。

沙盒:https://regexr.com/4fgop

有没有办法我仍然可以在javascript中做到这一点?

示例(通过将正则表达式与any equal symbols with any number of spaces in front or after it一起使用)

输入字符串: STRING.split(regexrulehere)

预期输出:

my-app command, arg1 arg2 arg3   =val1, arg4 = val2)

2 个答案:

答案 0 :(得分:2)

输入字符串中=周围有空格,并且不能期望在单个arg4=val2之后得到split(无空格)。

通过两个“正则表达式”步骤进行操作:

s = s.replace(/\s*=\s*/g, '=').match(/[^\s,()]+/g)

\s*=\s*匹配任何0+空格,=和0+空格,并且此replace删除=周围的所有空格。由于.match(/[^\s,()]+/g)negated character class,将提取除空格,()[^...]字符以外的所有1+个字符的块。 / p>

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)必须删除空白元素(如有)。

答案 1 :(得分:0)

正如您指出的那样,包括空格字符也可以,另一个选择可能是使用否定字符类[^\s(),=]+不匹配括号,逗号,等号或空格字符。

然后在匹配项后面跟随一个可选部分(?:....)?,该部分匹配由空格字符包围的等号,并再次使用否定的字符类:

[^\s(),=]+(?:\s*=\s*[^\s(),=]+)?

Regex demo