2011-07-06 6 views
2

私は正規表現とjavaに新しいので、私の新生児の質問に耐えてください。単語の挿入にjavaのregex apiを使用する

"I like ice cream only if it is chocolate ice cream. Chocolate cream" 

と私は一致してと一致するすべての単語を置き換えたい

"chocolate ice cream" 

のようなパターン:私は、文字列を持っている場合は

は、私は次の操作を行いたいです#それらを取り囲む。このように:

"I like #ice cream# only if it is #chocolate ice cream#. #Cholcolate cream#" 

私は、Javaの正規表現APIを使用し、私はMatcher.replaceAllを使用することができます理解しています。しかし、私は適切な正規表現を思いつくことに問題があります。私はこれを思いついたchocolate*\\s*ice*\\s*cream*。しかし、ここで問題となるのは、部分文字列全体にのみ一致するということです。すなわち、"chocolate ice cream"です。

chocolate|ice|cream|chocolate ice|ice cream|chocolate cream|chocolate ice cream 

など、すなわちすべての順列が、ストリングが大きくなるにつれて、これは面倒なことになります。私はこのような何かが仕事ができると思います。

私は適切な方向に進んでいくことに感謝します。

+0

い順物質から面白いのMessageFormatを見つけるのだろうか?あなたは 'アイスチョコレート'が一致するようにしますか? – Qtax

+0

@Qtax yes "#ice chocolate#" – Panther

答えて

7

パターンを使用します

(?i)\b((?:chocolate|ice|cream)(?:\s+(?:chocolate|ice|cream))*)\b 

をし、それを置き換える:

#$1# 

デモ:

String s = "I like ice cream only if it is chocolate ice cream. Chocolate cream"; 
s = s.replaceAll("(?i)\\b((?:chocolate|ice|cream)(?:\\s+(?:chocolate|ice|cream))*)\\b", "#$1#"); 
System.out.println(s); 

単語 "クリーミー" の原因の境界(および他のそのような言葉)交換するではありません。

"ice ice""#ice ice#"に変更されることに注意してください(言葉が複数回現れることがあります)。

+1

「クリームアイスクリーム」のようなものにマッチするのが良いなら、ニースのパターン – stema

+0

@stema:「ダブル」の単語についての良い点! –

3
(?:chocolate|ice|cream)(?:\s+(?:chocolate|ice|cream))* 

これは、これを試してみてください空白

+0

そして、質問 '(?i:chocolate | ice | cream)(?i:\\ s +(?:チョコレート) | ice | cream)) '' – wjans

+0

'' ice creamy ''は' '#ice cream#y''に変更されることに注意してください。おそらくそれはOPが望んでいるものですが、おそらくそうではありません。 –

+0

@Bart true、それをキャッチするためにあなたの解決策に+1: –

0

で区切られた指定された単語の一つ以上に一致します。

final String source = "I like ice cream only if it is chocolate ice cream. Chocolate cream"; 
final String result = source.replaceAll("((?:[Cc]hocolate)?(?:[Ii]ce)?cream)", "#$1#"); 

// Prints I like #ice cream# only if it is #chocolate ice cream#. #Chocolate cream# 
System.out.println(result); 

詳細についてはOptional Itemsを参照してください。

0

たぶん、あなたは、Java API

Object[] testArgs = {new Long(3), "MyDisk"}; 

MessageFormat form = new MessageFormat(
    "The disk \"{1}\" contains {0} file(s)."); 

System.out.println(form.format(testArgs)); 

// output, with different testArgs 
output: The disk "MyDisk" contains 0 file(s). 
output: The disk "MyDisk" contains 1 file(s). 
output: The disk "MyDisk" contains 1,273 file(s). 
関連する問題