我在用 Java 编写正则表达式来解析日志文件中的信息时遇到一些麻烦。
我有一个字符串,其中结构“timeinstant:具有任何字符的某些字符串”重复 1 到 N 次。
timeinstant 的格式为“dd/mm/yyyy hh:MM:ss:MMMMMM”(M 为微秒)。
我想做的是找到传入字符串中包含的最后一个时间点的微秒数。
例如,使用字符串
] 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
中)。
您的正则表达式非常接近您需要的正则表达式。
在你的负面展望中,你只是忘记了不同的时间戳是由几个字符分隔的。因此,您必须在前瞻中添加
.+
或 .*
来指定这一点。
这是您需要的正则表达式:
"(\\d{3}):(?!.+\\d{4}/\\d{2}/\\d{2}\\s\\d{2}:\\d{2}:\\d{2}:\\d{6})"
在您的示例中,它将为您提供您正在寻找的“987”。
如果您只对最后出现的三位数字和冒号感兴趣,那么
.*(\d{3}:)
不起作用吗?
你为什么不直接使用
(\\d{3}: \\w+)
然后使用 find.next() 直到没有下一个?