/ 負の先読みを含む/ Java正規表現 - java、regex、先読み、negative-lookahead、regex-lookaround

否定先読みを伴うJava正規表現 - java、regex、lookahead、negative-lookahead、regex-lookarounds

ログファイルから情報をパースするためにJavaで正規表現を書くのに苦労しています。

「timeinstant:任意の文字を含む文字列」という構造が1からN回繰り返されているStringがあります。

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)。

回答:

回答№1は2

あなたの正規表現はあなたが必要とするものに非常に近いです。

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

これが必要な正規表現です。

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

あなたの例では、それはあなたがあなたが探している "987"を与えるでしょう。


回答№2の場合は1

コロンがあとに続く3桁の最後の出現だけに興味があるなら、wouldn "t .*(d{3}:) 作業?


回答№3の場合は0

なぜあなたはちょうど使用しない

(\d{3}: \w+)

次にfind.next()を使用して、次に何も表示されなくなります。