我在Python中有一个正在运行的正则表达式,我正在尝试转换为Java。似乎实现中存在细微差别。
RegEx试图匹配另一个reg ex。有问题的RegEx是:
/(\\.|[^[/\\\n]|\[(\\.|[^\]\\\n])*])+/([gim]+\b|\B)
遇到问题的其中一个字符串是:/\s+/;
reg ex不应与结尾;
匹配。在Python中,RegEx正常工作(并且与结束;
不匹配,但在Java中它确实包含;
。
问题:
答案 0 :(得分:11)
对于一小组案例,Java不会像Python那样解析正则表达式。在这种特殊情况下,嵌套的[
导致了问题。在Python中,您不需要转义任何嵌套的[
,但您需要在Java中执行此操作。
原始RegEx(适用于Python):
/(\\.|[^[/\\\n]|\[(\\.|[^\]\\\n])*])+/([gim]+\b|\B)
修复的RegEx(适用于Java和Python):
/(\\.|[^\[/\\\n]|\[(\\.|[^\]\\\n])*\])+/([gim]+\b|\B)
答案 1 :(得分:5)
此外,您可能会遇到匹配方法之间的不匹配,而不是实际正则表达式中的差异:
鉴于Java
String regex, input; // initialized to something
Matcher matcher = Pattern.compile( regex ).matcher( input );
matcher.matches()
(也是Pattern.matches( regex, input )
)匹配整个字符串。它在Python中没有直接的等价物。使用re.match( regex, input )
和以regex
结尾的$
可以获得相同的结果。matcher.find()
和Python的re.search( regex, input )
匹配字符串的任何部分。matcher.lookingAt()
和Python的re.match( regex, input )
匹配字符串的开头。有关更多详细信息,请阅读Java Matcher
的文档并与Python documentation进行比较。
既然你说这不是问题,我决定做一个测试:http://ideone.com/6w61T
看起来java正在完全按照您的需要进行操作(组0,整个匹配,不包含;
)。你的问题在别处。