是否有一个JavaScript正则表达式等价于Java正则表达式中的交集(&&)运算符?

zi8p0yeb  于 2023-09-29  发布在  Java
关注(0)|答案(4)|浏览(103)

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

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

在JavaScript中有等价的吗?

mklgxw1f

mklgxw1f1#

在JavaScript中有等价的吗?
简单的回答:不,没有。它是特定的Java语法。
参见:Jan Goyvaerts和Steven Levithan的Regular Expressions Cookbook这里有一个相关部分的预览。
可能不用说,但下面的JavaScript代码:

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

与Java代码相同:

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

v64noz0r2#

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

[classA&&classB]

变成:

(?=classA)classB

例如,在Java中:

[a-z&&[^bc]]

与下面的行为相同:

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

这在JavaScript中完全支持。我不知道这两种形式的相对性能(在像Java和Ruby这样支持两者的引擎中)。
由于&&运算符是可交换的,因此您始终可以使用任何一侧作为(正或负)前瞻部分。
类与被否定的类的交集也可以用负前瞻来实现。因此,上面的例子也可以转换为:

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

avwztpqn3#

2023回答:是的,有。

the v flag

[[a-z]&&[def]]
[[a-z]&&[^bc]]

试试on regex101.com
你也可以做减法:[[a-z]--[bc]]。更多信息可以在MDN上找到。

5vf7fwbs

5vf7fwbs4#

你可以通过书写字符类来得到与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]

相关问题