使用通用语言的PCRE(Perl兼容正则表达式)有什么支持?

时间:2009-09-19 08:36:59

标签: pcre

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

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

编辑我对Java 1.6正则表达式之外的力量感兴趣,特别是命名为捕获组

5 个答案:

答案 0 :(得分:10)

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

Java的java.util.regex库使用的语法非常基于Perl(约5.8版)正则表达式,包括转义规则,\p\P Unicode类,非贪婪和“占有”量词,反向引用,\Q .. \E引用,以及几个(?...)构造,包括非捕获组,零宽度前瞻/后退和非回溯组。实际上,Java正则表达式与Perl正则表达式有更多共同点,而不是libpcre。 :)

JavaScript语言也使用从Perl派生的正则表达式;缺少Unicode类,lookbehind,占有量词和非回溯组,但我在Java中提到的其余内容也存在于JS中。

Python的正则表达式语法也基于Perl 5,具有非贪心量词,大多数(?...)构造包括非捕获组,前瞻/后退和条件模式,以及命名捕获组(但使用与Perl或PCRE不同的语法)。尽管标准为\p,{{1},但非回溯组和“占有”量词(据我所见)缺席,\P\d Unicode字符类也是如此。如果请求,{}和\s类可识别Unicode。

答案 1 :(得分:1)

这是一个古老的问题,但是为了进行更新,Java 7添加了名为捕获组。

答案 2 :(得分:0)

  

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

这需要推测,但我认为答案是否定的......就Java而言。我的基础是我无法找到任何值得的Java PCRE实现。 (当然除了java.util.regex。)

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

答案 3 :(得分: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

请务必使用&#39; x&#39;并且&#39; g&#39; (如有必要)修饰语。

Example

答案 4 :(得分:-3)

这听起来很像“X是真正的方式!?”有点问题。 PCRE有许多缺点,其中最明显的是它的复杂性和可疑的有用性。很少有任何一种真正的方法,在正则表达式库的领域,PCRE肯定不是它。

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