有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Python和Java之间正则表达式语法的差异

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

RegEx正在尝试匹配另一个RegEx。所讨论的RegEx是:

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

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

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

问题如下:

  1. 我该怎么做才能让这个正则表达式在Java中工作
  2. 根据我读到的here这个正则表达式应该没有区别。Python和Java中的正则表达式实现之间有什么不同吗

共 (2) 个答案

  1. # 1 楼答案

    b/w 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的^{}文档,并与Python documentation进行比较

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

  2. # 2 楼答案

    对于一小部分情况,Java不像Python那样解析正则表达式。在这种特殊情况下,嵌套的[会导致问题。在Python中,您不需要转义任何嵌套的[,但在Java中确实需要这样做

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

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

    固定正则表达式(适用于Java和Python):

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