2012-04-13 14 views
0

ログファイルの情報を解析するために、Javaで正規表現を書くのに問題があります。Javaルックアヘッドの正規表現

私は、 "timeinstant:任意の文字を含む文字列"という構造が1からN回繰り返されるStringを持っています。

timeinstantの形式は "dd/mm/yyyy hh:MM:ss:MMMMMM"です(Mはマイクロ秒です)。

私がやっていることは、入ってくる文字列に含まれている最後のtimeinstantのマイクロ秒を見つけることです。私は"987: pump..."を指すようにm.find()たい文字列

] 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} [ 

と例えば

、。先読みで正規表現を使用して、この、イムを得るために:

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

しかし、今m.find()は(2012/04/02 16:28:51:861819に含まれる)819を指しています。

答えて

2

正規表現は必要なものに非常に近いです。

あなたの否定的な見解では、異なるタイムスタンプが複数の文字で区切られていることを忘れてしまっただけです。したがって、先読みに.+または.*を追加して指定する必要があります。ここで

はあなたが必要とする正規表現です:あなたの例で

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

、それはあなたが捜している「987」を与えます。

+0

それだけです。先読みの最初と最後に*を付けました。どうもありがとうございました。 – Tom

0

なぜあなただ​​けの

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

を使用し、いずれかが、次がないまで)(find.next使用していませんか?

+0

Javaコードを変更することはできません。ただ受け取る正規表現は変更できません。 – Tom

1

最後の3桁の数字にコロンが続く場合にのみ、.*(\d{3}:)は機能しませんか?

+0

いいえ、なんらかの理由で私はthredigitsの最初の出現を ":" – Tom

+0

'"。*(\\ d {3}): "' '819'ではなく' 987'をキャプチャする必要があります。 – anubhava