javascript - 正则表达式量词

标签 javascript regex

我认为这对我的 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;

关于捕获与非捕获括号的题外话

我更喜欢 (?:...) 而不是 (...) 除非我真的想捕获内容,因为尽管 (?:.. .) 更冗长,它对使用正则表达式的代码的微妙影响更少。

当您不打算捕获内容时使用捕获组的一些问题包括:

  1. 更改现有组的编号,因为 JS 没有命名组,
  2. 使用效果比我需要的更多的运算符会使维护者误以为我是出于某种原因捕获内容,
  3. 改变远距离 exec 循环的行为, (这主要是 perlish 全局匹配的问题,例如 @foo = $str =~/(foo(bar))/g 但每隔一段时间你就会看到 JS 代码做类似的事情)
  4. 更改在其他地方定义的(可能是可变的)替换函数的行为,例如
    newStr = oldStr.replace(
        regexDefinedEarlier,
        function (var_args) {
          return [].slice.call(arguments, 1, arguments.length - 2).join('');
        });
    

关于javascript - 正则表达式量词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16196724/

相关文章:

javascript - Puppeteer.launch 取决于操作系统

javascript - WebApi 2.1 + Backbone.js 1.1.2 : sync everything at once

c# - 在 javascript 函数中添加 <%%> 将在页面加载时强制执行?

php - 为什么我的页面上有 �

regex - Vim:获取光标下语法元素的内容

javascript - AJAX 调用 - 每次点击闪烁更多

javascript - VueJs 条件 Handlebars

python - 类型错误 : expected string or bytes-like object and works on server but not on PC

regex - 括号如何改变正则表达式匹配的结果?

regex - 用于验证手机号码的 Flutter 正则表达式