2012-05-04 6 views
7
String x = "Welcome to Java World"; 
System.out.println(x.replaceAll(".*","JAVA")); 
Actual Output = "JAVAJAVA" . 
Excepted Output = "JAVA". 

なぜこのように置き換えられるのか誰に助けてもらえますか? "。*"元の文字列のすべての文字を "JAVA"に置き換えます。なぜこれが "JAVAJAVA"を返しますか?JavaのString replaceAllメソッドを使用して文字列全体を新しい値に置き換えたい

+0

"。+"正規表現として試してみることができますか?おそらく、マッチングでは、空のStringを任意のStringの部分文字列と見なし、次に文字列の実際の内容を2番目の部分文字列とみなし、2回置き換えますか?しかし何よりも暗闇の中のショットのほうが多い。 –

答えて

13

正規表現では、すべての文字を0に一致させることができます。まず、文字列全体が"Welcome to Java World"と一致し、文字列""の末尾に一致し、両方を"JAVA"に置き換えます。

この動作を期待するには、いくつかのオプションがあります。

*の代わりに+が付いていることに注意してください。これは1つ以上のことを意味するため、末尾は一致しません。

または

String x = "Welcome to Java World"; 
System.out.println(x.replaceFirst(".*","JAVA")); 

これだけ"JAVA"と、文字列全体に置き換えられます、文字列の末尾に空は置き換えられません。

+0

+1、多分、これ(どこに、そして、すべての文字列に空の部分文字列が含まれているのかを意味する)のリンクが詳細に説明されているリンクを知っていますか?理解することは難しくありませんが、やや驚くべきことです。 –

+0

このタイプのものの最も明確な場所は[ソース自体]です(http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8-b132/java/util /regex/Matcher.java#Matcher.replaceAll%28java.lang.String%29)。実際に何が起こっているのかを実際に理解するには、そのクラスをいくつか取り上げますが、それは実際には(http://blog.codinghorror.com/learn-to-read-the-source-luke/)最良の方法ですわかる。 –

1

あなたのミッションにはreplaceAllは必要ありません。まったく同じ意味は、単にStringは、Javaで不変なので、あなたは新しいオブジェクトを避けることができない

System.out.println("JAVA"); 

を示すことによって達成されます。

+0

これは正規表現についてのものなので、質問にはあまり関係がありません。文字列に彼が望むコンテンツをどのように格納するかについてではありません。 –

+0

正規表現についてはわかりません。質問はそれを動機づけしなかった。 –

1

なぜ "replaceAll"を使用し、 "="を使用しないのですか? 文字列はJavaで不変です

1

x.replaceAll( "。* \ z"、 "JAVA");次の形式を使用することもできます。

。*は文字列の終わりの前に一致し、\ zは文字列の最後に一致します。

関連する問題