Python和Java之间RegEx语法的差异

时间:2012-05-08 03:29:38

标签: java python regex

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

RegEx试图匹配另一个reg ex。有问题的RegEx是:

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

遇到问题的其中一个字符串是:/\s+/;

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

问题:

  1. 如何让这个RegEx在Java中运行?
  2. 根据我阅读here的内容,此RegEx应该没有区别。 Python和Java中的RegEx实现之间是否存在差异列表?

2 个答案:

答案 0 :(得分:11)

对于一小组案例,Java不会像Python那样解析正则表达式。在这种特殊情况下,嵌套的[导致了问题。在Python中,您不需要转义任何嵌套的[,但您需要在Java中执行此操作。

原始RegEx(适用于Python):

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

修复的RegEx(适用于Java和Python):

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

答案 1 :(得分:5)

Java和Python的明显不同之处在于,在Java中你需要逃避很多角色。

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

鉴于Java

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

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

既然你说这不是问题,我决定做一个测试:http://ideone.com/6w61T 看起来java正在完全按照您的需要进行操作(组0,整个匹配,不包含;)。你的问题在别处。