8

我对 PCRE(Perl 兼容正则表达式)的强大功能很感兴趣,并且想知道它们是否有可能成为所有主要语言中事实上的方法(我对 Java 很感兴趣)。如有必要,我准备使用图书馆。

我也无法在 SO 中找到一个描述 PCRE 优缺点的好页面,所以如果这不存在,将其包含在答案中可能会很有用

编辑我对超越 Java 1.6 正则表达式的能力感兴趣,特别是命名的捕获组

4

5 回答 5

10

似乎更多的主流语言实际上使用自己的“类 Perl”正则表达式实现,而不是实际使用 libpcre。属于此类的语言包括(至少)Java、JavaScript 和 Python。

Java 的java.util.regex库使用非常基于 Perl(大约 5.8 版)正则表达式的语法,包括转义规则、the\p\PUnicode 类、非贪婪和“占有”量词、反向引用、\Q..\E引用和一些(?...)结构包括非捕获组、零宽度前瞻/后视和非回溯组。事实上,Java 正则表达式与 Perl 正则表达式的共同点似乎比 libpcre 更多。:)

JavaScript 语言还使用从 Perl 派生的正则表达式;没有 Unicode 类、lookbehind、所有格量词和非回溯组,但我提到的 Java 的其余部分在 JS 中也存在。

Python 的正则表达式语法也基于 Perl 5,具有非贪婪量词,大多数(?...)结构包括非捕获组、前瞻/后视和条件模式,以及命名捕获组(但与 Perl 的语法不同或 PCRE)。非回溯组和“占有”量词(据我所知)不存在,\pUnicode\P字符类也是如此,尽管如果需要,标准\d、、\s\w类可以识别 Unicode。

于 2009-09-19T09:14:38.413 回答
1

我......想知道他们 [PCRE] 是否有可能成为所有主要语言的事实上的方法(我对 Java 感兴趣)。

这需要猜测,但我认为答案是“否”......在 Java 的情况下。我基于这样一个事实,即我找不到任何有价值的 Java PCRE 实现。

如果对 Java 中的 PCRE 有真正的需求/需求,我预计会有更多的库。


更新

自从我写了原始答案以来,更多的人/团体已经实现了提供(或声称提供)PCRE 兼容正则表达式的 Java 库。

显然,随着时间的推移,Java 团队可能(并且已经)将一些 Perl 特性添加到 Java 的正则表达式支持中。例如,在 Java 7 中添加了命名捕获组。

但是完全兼容 PCRE 似乎并不是 Java 团队的优先目标。例如:

鉴于完全兼容可能会破坏现有 Java 应用程序的一个子集,我仍然认为答案是否定的。

于 2013-08-06T07:03:18.100 回答
1

这是一个老问题,但为了更新它,Java 7 添加了命名捕获组。

于 2020-08-25T17:08:29.307 回答
0

尝试拆分这场比赛:

(?:
  (?:'[\S\s]*?(?<!\\)') # Consume characters inside of a quoted string
  |(?:\/\*[\S\s]*?\*\/) # Consume multi-line comments
  |(?m:\/{2}[^\n]*$\n)  # Consume single-line comments
)(*SKIP)(*F)            # Fail match if any of the previous matches were found
|(?<=;)                 # Capture position right after semicolon

请务必使用“x”和“g”(如有必要)修饰符。

例子

于 2015-08-11T17:53:41.143 回答
-3

这听起来很像“X是唯一的真道吗!?” 一种问题。PCRE 有许多缺点,其中最明显的是它的复杂性和值得怀疑的实用性。很少有任何事情都存在一个真正的方法,并且在正则表达式库的领域中,PCRE 肯定不是。

在我看来,Perl 正则表达式完全是垃圾。一旦您远远超出了 POSIX 扩展正则表达式 (ERE) 提供的功能集,您还可以使用 PEG 实现之类的东西。PCRE 被广泛使用的唯一原因是人们很容易通过放入库来解决问题。

于 2013-12-12T22:04:26.207 回答