8

我在 Python 中有一个工作正则表达式,我正在尝试转换为 Java。似乎在实现中存在细微差别。

RegEx 正在尝试匹配另一个 reg ex。有问题的正则表达式是:

/(\\.|[^[/\\\n]|\[(\\.|[^\]\\\n])*])+/([gim]+\b|\B)

它遇到问题的字符串之一是:/\s+/;

reg ex 不应该与结尾匹配;。在 Python 中,RegEx 可以正常工作(并且与结尾不匹配;,但在 Java 中它确实包含;.

问题:

  1. 我该怎么做才能让这个 RegEx 在 Java 中工作?
  2. 根据我在此处阅读的内容,此 RegEx 应该没有区别。Python与Java中的RegEx实现之间是否存在差异列表?
4

2 回答 2

12

对于一小部分情况,Java 不会以与 Python 相同的方式解析正则表达式。在这种特殊情况下,嵌套[的 's 引起了问题。在 Python 中,您不需要转义任何嵌套[,但在 Java 中确实需要这样做。

原始正则表达式(用于 Python):

/(\\.|[^[/\\\n]|\[(\\.|[^\]\\\n])*])+/([gim]+\b|\B)

固定的 RegEx(用于 Java 和 Python):

/(\\.|[^\[/\\\n]|\[(\\.|[^\]\\\n])*\])+/([gim]+\b|\B)
于 2012-05-08T16:53:01.183 回答
9

黑白 Java 和 Python 的明显区别在于,在 Java 中,您需要转义很多字符。

此外,您可能会遇到匹配方法之间的不匹配,而不是实际正则表达式表示法的差异:

鉴于 Java

String regex, input; // initialized to something
Matcher matcher = Pattern.compile( regex ).matcher( input );
  • Java 的matcher.matches()(also Pattern.matches( regex, input )) 匹配整个字符串。它在 Python 中没有直接的等价物。re.match( regex, input )使用以regex结尾的 with可以达到相同的结果$
  • Javamatcher.find()和 Pythonre.search( regex, input )匹配字符串的任何部分。
  • Javamatcher.lookingAt()和 Pythonre.match( regex, input )匹配字符串的开头。

有关更多详细信息,请阅读 Java 文档Matcher并与Python 文档进行比较。

既然你说这不是问题,我决定做一个测试: http: //ideone.com/6w61T 看起来java正在做你需要的事情(第0组,整个比赛,不包含;)。你的问题在别处。

于 2012-05-08T04:03:50.637 回答