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

Posted

技术标签:

【中文标题】是否有与 Java 正则表达式中的交集 (&&) 运算符等效的 JavaScript 正则表达式?【英文标题】:Is there a JavaScript regex equivalent to the intersection (&&) operator in Java regexes? 【发布时间】: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 标志),并且没有\pL 速记字符类。当然,您可以自己定义它们,但这并不好玩。 @T.J.:我知道你对第一个例子的意思——我猜他们不想因为有用而分散我们的注意力? 【参考方案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]

【讨论】:

以上是关于是否有与 Java 正则表达式中的交集 (&&) 运算符等效的 JavaScript 正则表达式?的主要内容,如果未能解决你的问题,请参考以下文章

未记录的 Java 正则表达式字符类:\pC

java正则表达式

是否有与 PHP 的 preg_replace 等效的 MySQL?

密码校验正则表达式(java 环境)

java正则表达式

是否有任何正则表达式用于从文本中查找和提取字符串