在正则表达式中使用命名组导致" Lookbehind没有明显的最大长度"错误

时间:2015-05-26 17:52:23

标签: java regex java-6

我有一些这样的日志文件:

21.125.155.111 - - [01/Jan/2012:12:07:48 +0530] "GET /digital-cameras/digital-camera/sony-qx-dsc-qx100-point-shoot-digital-camera-black.html HTTP/1.1" 200 1470 "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.17) Gecko/20110420 Firefox/3.6.17" "-"

我的模式是:

"(?<ip>[\\d\\.]+)(.+)\\\"(?<verb>\\w+) (?<address>.+) (?<protocol>[HTTPS]+)/(?<version>.+?)\\\"\\s(?<status>\\d+)\\s(?<time>\\d+)\\s\\\"(?<useragent>.*)\\\"\\s(.*)"

但是当我尝试编译模式时,我得到了上面的PatternSyntaxException。

它在C#中完美运行,但在Java 1.6中提供了异常。

1 个答案:

答案 0 :(得分:3)

您所遇到的是一个产生错误错误消息的Java错误。 Java 6不支持命名组,因此当正则表达式编译器看到(?<时,它会跳到你试图创建一个lookbehind的结论。它应该等到它在执行任何操作之前再读取一个字符,并且如果下一个字符不是=!,它应该抛出一个带有更一般解释的异常,例如“未知组构造”

但问题的解决方案是升级到Java 7,或使用旧式编号组而不是命名类型。