0

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

我有一个字符串,其中结构“timeinstant:一些带有任何字符的字符串”重复了 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)。

4

3 回答 3

2

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

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

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

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

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

于 2012-04-13T19:41:54.703 回答
1

如果您只对最后出现的三个数字后跟冒号感兴趣,那.*(\d{3}:)行不通?

于 2012-04-13T19:30:25.553 回答
0

你为什么不直接使用

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

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

于 2012-04-13T19:30:05.303 回答