2016-11-23 3 views
-1

によって分割文字列は、私はJavaでのJava - 正規表現

[timestamp] [ABC_DEF] this is message.

以下

のような文字列を持って、私は this is message.

私はのlastIndexOfを取得することにより、それを分割しようとした上で文字列を分割して取得する必要があります]、次に部分文字列。しかし、私のメッセージには]が含まれている可能性があり、すべてが間違っています。

だから私はregexを使ってやりたかったのです。

正規表現で一致するようにしたい[timestamp] [ABC_DEF] .Timestampは何でもかまいませんが、[ABC_DEF]に一致する必要があります。それから私は私のメッセージを得るべきです。

他のアプローチを示唆している場合は、同じまたは任意の正規表現を書く上での提案も私にとってはうまくいきます。

ありがとうございました。ただString方法では

+2

リテラルの[ABC_DEF]のマッチングはそれほど難しくありませんか?試してみたいですか? – Henry

+0

はい、それはあなたの質問に書いたものです。それを試してみてください、あなた自身ですべてをやり遂げることができなければ、私たちはお手伝いします。 – Thomas

+0

Re: 'lastIndexOf':なぜ' indexOf'(2回)を使わないのですか? – Thomas

答えて

1

:ここ

String filter = "[ABC_DEF]"; 
int filterIndex = line.indexOf(filter); 
if (filterIndex >= 0) { 
    return line.substring(filterIndex + filter.length()).trim(); 
} 

、あなたは文字列[ABC_DEF]lineに含まれているし、もしそうであれば、文字列内のどの位置にあるかどうかを確認してください。次に、見つかったインデックスに[ABC_DEF]の長さを追加して、そのオカレンスにジャンプします。行の残りはメッセージであり、substringメソッドを使用して抽出されます。最後に、不要な空白はtrim()で切り捨てられます。正規表現を


String filter = "\\[ABC_DEF\\]"; // note the backslashs 
Pattern pattern = Pattern.compile("^\\[[^]]*\\]\\s+" + filter + "\\s*(.*)$"); 
Matcher matcher = pattern.match(line); 
if (matcher.matches()) { 
    return matcher.group(1).trim(); 
} 

まず、あなたはlineに一致する必要があり、正規表現をコンパイルします。 (複数の行をチェックする場合、の定義は1回だけ行う必要があります)。[]は正規表現で特別な意味を持つ文字なので、それらを正規表現に含めるときはバックスラッシュでエスケープする必要があります。行のメッセージ部分は()の間のキャプチャなので、式が一致する場合はgroupメソッドを使用してメッセージ部分を簡単に抽出できます。上記の場合と同様に、メッセージの最初と最後に不要な空白を削除します(trim())。