2013-04-22 20 views
7

このコードを考えると、交換を返します:私は推測していたとしてが正規表現で文字列を置き換えることは二度

String replaced = "A".replaceAll(".*", "HI"); 

はなぜreplacedは、文字列HIHIの代わりHIが含まれていますか? ^.*というパターンを使用すると、HIという結果になってしまいますが、これは理由がありません。

+0

'。+'を使用すると、空の文字列( '" "')がマッチするのを防ぐことができます。 – brimborium

答えて

5

を印刷されているされているシングルになり

String replaced = "".replaceAll(".*", "HI"); 

をテストすることによって、これを見ることができます ストリングの終わり。もちろん、^.*は "A"の最後にある空の文字列と一致しないので、 "HI"は1つだけになります。

5

replaceAllを参照javadoc:この文字列の各部分文字列を、指定された正規表現に一致する部分文字列を置き換えます。 これは2つの部分文字列 ""と "A"に一致します。あなたは、私が.*が最初の文字列全体にマッチし、その後で空の文字列に一致するためこれがあると思い「HI」

+2

"A"には、0と1の2つの位置があります(0と1)。 "A"が一致すると、1 ""が一致します。 –

+0

@JoopEggenとにかくそれは逆に直感的です。 '。*'が欲張りであれば、最後に空の文字列を含め**文字列全体を「食べる」必要があります。 –

+0

2つの空の文字列 "A" .replaceAll( ""、 "HI")== HIAHI' – Kent

0

Matcherクラスのfindメソッドは、 "A"の後に "A"と空のStringを見つけます。したがって、2つの置換があります。

0

replaceAll方法は、(read more)などの正規表現と交換パラメータを受け取る: -

public String replaceAll(String regex, 
         String replacement) 

この例で.*は、正規表現を表します。

.は、任意の文字(または行末に一致しない場合があります)

*は、あなたの与えられたコードの出力は権利である(Read More regexp

を0回以上を示して示しています。正規表現は、*との一致はゼロ回以上の意味です。そしてそれは結果に影響します。

String replaced = "A".replaceAll(".*", "HI"); 

出力: - HIHI

は、それはあなたを助けることを願っています。

関連する問題