我有一些这样的日志文件:
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中提供了异常。
答案 0 :(得分:3)
您所遇到的是一个产生错误错误消息的Java错误。 Java 6不支持命名组,因此当正则表达式编译器看到(?<
时,它会跳到你试图创建一个lookbehind的结论。它应该等到它在执行任何操作之前再读取一个字符,并且如果下一个字符不是=
或!
,它应该抛出一个带有更一般解释的异常,例如“未知组构造”
但问题的解决方案是升级到Java 7,或使用旧式编号组而不是命名类型。