是否存在JavaScript正则表达式中与Java正则表达式中的交集(&&)运算符等效的内容?

10
在Java正则表达式中,您可以在字符类中使用交集运算符&&来简洁地定义它们,例如:
[a-z&&[def]]    // d, e, or f
[a-z&&[^bc]]    // a through z, except for b and c

JavaScript中是否有相应的功能?

1
第一个例子似乎没有什么意义,因为它相当于[def]。我有什么地方理解错了吗?第二个例子很有意义(而且很酷)。 - T.J. Crowder
1
无论如何,它也没有什么用处,因为JavaScript具有有限的速记字符类,并且没有Unicode支持。我猜它可能对于Unicode范围有用,但是它并不能节省太多打字时间。你需要什么? - Kobi
1
@Kobi:你指的“没有Unicode支持”是什么意思?JavaScript本身就使用Unicode(具体来说是UTF-16),并且在正则表达式中支持Unicode转义序列,包括字符类中的转义序列。 - T.J. Crowder
1
@TJ - 我指的是JavaScript中的正则表达式,而不是整个JavaScript语言。它无法使'אבג'.match(/\w+/)匹配(即没有/u标志),也没有\p{L}的简写字符类。当然你可以自己定义它们,但那样并不好玩。 - Kobi
@Kobi:我在谈论正则表达式。的确,\w 的定义是以英语为中心的(这很奇怪,\s 的定义不是,它包括所有 Unicode 的“空格分隔符”字符,尽管实现有时会出错)。但是因为 \w 的定义方式过于简单化(我真的希望他们在 v6 中修复这个问题),这并不意味着没有“Unicode 支持”。 - T.J. Crowder
显示剩余2条评论
4个回答

12

JavaScript没有同等功能。这是特定于Java语法。

参见:《正则表达式烹饪书》 (Jan Goyvaerts和Steven Levithan)。以下是相关章节的窥视

可能不需要说,但以下JavaScript代码:

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

会做与Java代码相同的事情:

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

5
正如其他人所说,没有一个等效的方法,但是您可以使用前瞻来实现&&的效果。 转换为:

像这样:

[classA&&classB]

变成:

(?=classA)classB

例如,在Java中:

[a-z&&[^bc]]

与此相同的行为是:

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

JavaScript完全支持这种方式。我不知道在像Java和Ruby这样同时支持两种形式的引擎中,哪种形式的性能更高。

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

类与否定类的交集也可以用负向前瞻来实现。因此,上面的例子也可以转换为:

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

2
2023的答案是:是的。
使用 v 标志
[[a-z]&&[def]]
[[a-z]&&[^bc]]

试试它们on regex101.com
你还可以进行减法:[[a-z]--[bc]]。更多信息可以在on MDN找到。

它甚至在我的Opera浏览器上也能运行。:D 不过我还是会犹豫是否在生产中使用它,最好再等几年。 - undefined
1
@bobblebubble 就像在JS中的任何其他新功能一样,Babel确实对v有很好的支持:)。你可以在这里找到有关v的详细信息:https://babeljs.io/docs/babel-plugin-transform-unicode-sets-regex。 - undefined

1
你可以通过手写字符类来获得与Java正则表达式相同的结果,例如在JavaScript中。
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]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接