2012-04-13 51 views
0

我在Java中编写正则表达式以解析来自日志文件的信息时遇到了一些麻烦。带有负向视图的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)。

回答

2

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

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

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

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

在您的例子,它会给你的“987”,你正在寻找。

+0

就是这样。我在开头和结尾添加了*。非常感谢你。 – Tom 2012-04-13 19:48:49

0

你为什么不只是使用

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

,然后使用find.next(),直到没有任何未来?

+0

我不能改变java代码,只是它收到的正则表达式。 – Tom 2012-04-13 19:31:35

1

如果您只对最后一次出现的三位数后跟一个冒号感兴趣,那么.*(\d{3}:)不会起作用吗?

+0

不,由于某种原因,我得到了第一次出现的信号,然后是“:” – Tom 2012-04-13 19:32:39

+0

'“。*(\\ d {3}):”'应该捕获'987'而不是'819'。 – anubhava 2012-04-13 19:45:54