我对PCRE(Perl兼容正则表达式)的强大感兴趣,并想知道它们是否可能成为所有主要语言的事实上的方法(我对Java感兴趣)。如有必要,我准备使用图书馆。
我也无法在SO中找到一个描述PCRE优缺点的好页面,所以如果不存在,将其包含在答案中可能会有用
编辑我对Java 1.6正则表达式之外的力量感兴趣,特别是命名为捕获组
答案 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; (如有必要)修饰语。
答案 4 :(得分:-3)
这听起来很像“X是真正的方式!?”有点问题。 PCRE有许多缺点,其中最明显的是它的复杂性和可疑的有用性。很少有任何一种真正的方法,在正则表达式库的领域,PCRE肯定不是它。
在我看来,Perl正则表达式完全是垃圾。一旦超出POSIX扩展regexps(ERE)提供的功能集,您可以使用类似PEG实现的东西。使用如此广泛的PCRE的唯一原因是因为人们很容易通过放入库来解决问题。