具有负前瞻的Java正则表达式

时间:2012-04-13 19:22:44

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

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

我有一个字符串,其中结构“timeinstant:一些具有任何字符的字符串”重复1到N次。

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

我要做的是找到传入字符串中包含的last 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中)。

3 个答案:

答案 0 :(得分:2)

你的正则表达式非常接近你需要的那个。

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

以下是您需要的正则表达式:

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

为什么不使用

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

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