【问题标题】:Java regular expressions with negative lookahead带有负前瞻的 Java 正则表达式
【发布时间】:2012-04-13 19:22:44
【问题描述】:

我在用 Java 编写正则表达式来解析日志文件中的信息时遇到了一些麻烦。

我有一个字符串,其中结构“timeinstant: some strings with any character”重复了 1 到 N 次。

timeinstant 的格式为“dd/mm/yyyy hh:MM:ss:MMMMMM”(M 为微秒)。

我想要做的是找到传入字符串中包含的最后一个 timeinstant 的微秒。

例如,用字符串

] 2012/04/02 16:28:51:861819: abcdefg : lwersdgsdg remote=xx.xxx.xx.xxx:yyy3f] accepted and identified as: John 2012/04/02 16:28:51:862987: pump: Received data on connection {John} [

我希望m.find() 指向"987: pump..."。为了得到这个,我使用了一个带有前瞻的正则表达式:

"(\\d{3}:)(?!\\d{4}/\\d{2}/\\d{2}\\s\\d{2}:\\d{2}:\\d{2}:\\d{6})"

但现在m.find() 指向819(包含在2012/04/02 16:28:51:861819 中)。

【问题讨论】:

    标签: java regex lookahead negative-lookahead regex-lookarounds


    【解决方案1】:

    您的正则表达式与您需要的非常接近。

    在您的负面外观中,您只是忘记了不同的时间戳由几个字符分隔。所以你必须在你的前瞻中添加.+.* 来指定。

    这是您需要的正则表达式:

    "(\\d{3}):(?!.+\\d{4}/\\d{2}/\\d{2}\\s\\d{2}:\\d{2}:\\d{2}:\\d{6})"
    

    在您的示例中,它将为您提供您正在寻找的“987”。

    【讨论】:

    • 就是这样。我在前瞻的开头和结尾添加了 .* 。非常感谢。
    【解决方案2】:

    如果您只对最后出现的三位数字和冒号感兴趣,.*(\d{3}:) 不工作吗?

    【讨论】:

    • 不,由于某种原因,我得到了第一次出现的 thredigits,然后是“:”
    • ".*(\\d{3}):" 应该捕获 987 而不是 819
    【解决方案3】:

    你为什么不直接使用

    (\\d{3}: \\w+)

    然后使用 find.next() 直到没有下一个?

    【讨论】:

      猜你喜欢
      • 2020-09-09
      • 2012-06-22
      • 2012-12-07
      • 1970-01-01
      • 1970-01-01
      • 2021-10-11
      • 2011-10-14
      • 2010-12-17
      • 1970-01-01
      相关资源
      最近更新 更多