是否有与 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 正则表达式?的主要内容,如果未能解决你的问题,请参考以下文章