【问题标题】:Is there a JavaScript regex equivalent to the intersection (&&) operator in Java regexes?是否有与 Java 正则表达式中的交集 (&&) 运算符等效的 JavaScript 正则表达式?
【发布时间】:2011-09-29 13:02:21
【问题描述】:

在 Java 正则表达式中,您可以在字符类中使用交集运算符 && 来简洁地定义它们,例如

[a-z&&[def]]    // d, e, or f
[a-z&&[^bc]]    // a through z, except for b and c

在 JavaScript 中有没有等价物?

【问题讨论】:

  • 看不到第一个例子的意义,因为它相当于[def]。我错过了什么吗?第二个是有道理的(而且很酷)。
  • 无论如何它不会有太大用处,因为 JavaScript 有有限的速记字符类,并且不支持 Unicode。我想它可能对 Unicode 范围很有用,但它并没有节省太多的打字时间。你到底需要什么?
  • @Kobi:“不支持 Unicode”是什么意思? JavaScript 原生使用 Unicode(特别是 UTF-16)并支持正则表达式中的 Unicode 转义序列,包括字符类。
  • @TJ - 我指的是 JavaScript 的正则表达式,而不是整个 JavaScript。它不能使'אבג'.match(/\w+/) 匹配(即没有/u 标志),并且没有\p{L} 速记字符类。当然,您可以自己定义它们,但这并不好玩。
  • @T.J.:我知道你对第一个例子的意思——我猜他们不想因为有用而分散我们的注意力?

标签: java javascript regex


【解决方案1】:

在 JavaScript 中有没有等价物?

简单的回答:不,没有。它是特定的 Java 语法。

请参阅:Jan Goyvaerts 和 Steven Levithan 的 Regular Expressions Cookbook。这里是a sneak-peek to the relevant section

可能不用多说,但下面的 JavaScript 代码:

if(s.match(/^[a-z]$/) && s.match(/[^bc]/)) { ... }

将与 Java 代码相同:

if(s.matches("[a-z&&[^bc]]")) { ... }

【讨论】:

    【解决方案2】:

    正如其他人所说,没有等价物,但您可以使用前瞻实现&& 的效果。转换为:

    [classA&&classB]
    

    变成:

    (?=classA)classB
    

    例如,Java 中的 this:

    [a-z&&[^bc]]
    

    具有与此相同的行为:

    (?=[a-z])[^bc]
    

    JavaScript 完全支持。我不知道这两种形式的相对性能(在支持这两种形式的 Java 和 Ruby 等引擎中)。

    由于&& 运算符是可交换的,您始终可以将任一侧用于(正或负)前瞻部分。

    一个类与一个否定类的交集也可以用负前瞻来实现。所以上面的例子也可以转化为:

    (?![bc])[a-z]
    

    【讨论】:

      【解决方案3】:

      您可以通过手写字符类来获得与 JavaScript 中的 Java 正则表达式相同的结果,例如

      Java           JavaScript   English
      ------------   ----------   -------
      [a-z&&[def]]   [def]        d, e, or f
      [a-z&&[^bc]]   [ad-z]       a through z, except for b and c
      

      这只是在某些情况下更冗长/晦涩,例如

      Java               JavaScript
      ----------------   -----------
      [A-Z&&[^QVX]]      [A-PR-UWYZ]
      [A-Z&&[^CIKMOV]]   [ABD-HJLNP-UW-Z]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-07
        • 1970-01-01
        • 2012-10-30
        • 2010-10-02
        相关资源
        最近更新 更多