是否有一个JavaScript正则表达式相当于Java正则表达式中的intersection(&&)运算符?

Pau*_*ite 9 javascript java regex

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

[a-z&&[def]]    // d, e, or f
[a-z&&[^bc]]    // a through z, except for b and c
Run Code Online (Sandbox Code Playgroud)

JavaScript中是否有等价物?

Bar*_*ers 12

JavaScript中是否有等价物?

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

请参阅:Jan Goyvaerts和Steven Levithan撰写的正则表达手册.这是对相关部分的偷看.

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

if(s.match(/^[a-z]$/) && s.match(/[^bc]/)) { ... }
Run Code Online (Sandbox Code Playgroud)

会像Java代码一样:

if(s.matches("[a-z&&[^bc]]")) { ... }
Run Code Online (Sandbox Code Playgroud)


Ted*_*opp 5

正如其他人所说,没有等效的,但您可以达到&&使用前瞻的效果。变换是:

[classA&&classB]
Run Code Online (Sandbox Code Playgroud)

变成:

(?=classA)classB
Run Code Online (Sandbox Code Playgroud)

例如,在 Java 中:

[a-z&&[^bc]]
Run Code Online (Sandbox Code Playgroud)

具有与此相同的行为:

(?=[a-z])[^bc]
Run Code Online (Sandbox Code Playgroud)

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

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

类与否定类的交集也可以通过否定前瞻来实现。所以上面的例子也可以改写为:

(?![bc])[a-z]
Run Code Online (Sandbox Code Playgroud)