【问题标题】:Using named groups in regex causes "Lookbehind doesn't have obvious maximum length" error在正则表达式中使用命名组会导致“Lookbehind 没有明显的最大长度”错误
【发布时间】:2015-05-26 17:52:22
【问题描述】:

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

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 中出现异常。

【问题讨论】:

  • 看看java和c#中使用的regex模式的区别:stackoverflow.com/questions/538579/…
  • public class testerclass { private static final String pat = "(?[\\d\\.]+)(.+)\\\"(?\\w+ ) (?.+) (?[HTTPS]+)/(?.+?)\\\"\\s(?\\d+)\\s(? \\d+)\\s\\\"(?.*)\\\"\\s(.*)"; public static void main(String[] args) { Pattern p = Pattern.compile(pat);}
  • @Pranati 正则表达式的目的是什么?只是为了匹配日志还是为了捞出一些数据?

标签: java regex java-6


【解决方案1】:

您所得到的是一个产生错误错误消息的 Java 错误。 Java 6 不支持命名组,因此当正则表达式编译器看到(?&lt; 时,它会立即得出结论,即您正在尝试创建一个lookbehind。它应该等到它再读取一个字符后再做任何事情,如果下一个字符不是= 或!,它应该抛出一个带有更一般解释的异常,例如“未知组构造”。

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

【讨论】:

  • 非常感谢艾伦,我删除了命名组及其现在的工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-04
相关资源
最近更新 更多