我认为这对我的 regEx 来说是一个“不费吹灰之力”的添加,但事实证明我当然错了......
如果字符串是符号(-、$、+、=、(、)、{、}),我当前的正则表达式返回 true:
(/^[-$+)(}{]$/).test(token);
我想在正则表达式中添加两个符号,赋值运算符 (=) 和相等运算符 (==)。我的直觉引导我按照以下方式做一些事情,如果存在带有一个或两个“=”的标记,则返回 true:
(/^[-$+)(}{]|(=){1,2}$/).test(token);
但如果实际 token 是 (/^[-$+)(}{]|(=){1,2}$/).test("===")
返回 true。
有人可以阐明我的 regEx 缺点吗?
谢谢
最佳答案
您遇到了一个微妙的运算符优先级问题。
/^[-$+)(}{]|(=){1,2}$/
^
和 $
比 |
绑定(bind)得更紧密,所以这等同于
/(?:^[\-$+)(}{])|(?:={1,2}$)/
而不是你可能想要的是 ^...$
包含 |
:
/^(?:[\-$+)(}{]|={1,2})$/
或简化
/^(?:[\-$+(){}]|==?)$/
/^(?:[\-$+(){}]|==?)$/.test("===") === false;
/^(?:[\-$+(){}]|==?)$/.test("()") === false;
/^(?:[\-$+(){}]|==?)$/.test("=") === true;
/^(?:[\-$+(){}]|==?)$/.test("==") === true;
/^(?:[\-$+(){}]|==?)$/.test("(") === true;
关于捕获与非捕获括号的题外话
我更喜欢 (?:...)
而不是 (...)
除非我真的想捕获内容,因为尽管 (?:.. .)
更冗长,它对使用正则表达式的代码的微妙影响更少。
当您不打算捕获内容时使用捕获组的一些问题包括:
- 更改现有组的编号,因为 JS 没有命名组,
- 使用效果比我需要的更多的运算符会使维护者误以为我是出于某种原因捕获内容,
- 改变远距离
exec
循环的行为, (这主要是 perlish 全局匹配的问题,例如@foo = $str =~/(foo(bar))/g
但每隔一段时间你就会看到 JS 代码做类似的事情) - 更改在其他地方定义的(可能是可变的)替换函数的行为,例如
newStr = oldStr.replace( regexDefinedEarlier, function (var_args) { return [].slice.call(arguments, 1, arguments.length - 2).join(''); });
关于javascript - 正则表达式量词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16196724/