2011-02-07 2 views
1

javaを使用しています。特定の文字列の出現を他の文字と置き換えようとしています。それはほとんどの場合に機能します。しかし、特定の文字列が指定されたコンテンツに置き換えられないことがあります。 String.replaceFirstは、予期される文字列を時々置き換えません。

私は与えられたコンテンツ内の特定の文字列がindexOfメソッドを使用していることを検索し

、私は正確にその文字列のインデックスを取得することができます。しかし、私はその文字列を置き換えるreplaceFirstメソッドを使用すると、操作は失敗して終了します。

次に、エスケープ文字からエスケープするために、次のように置き換えようとしました。

cont = Pattern.compile(str, Pattern.LITERAL).matcher(cont) 
    .replaceFirst(Matcher.quoteReplacement("replace string")) 

は、私たちは動物ください 訪問このサイト http://www.example.net/animals/cat_345_456.JPG の絵のために例として、コンテンツの下に

を取ることができます。この詳細については、 http://www.moredetails.com/example/imgs/nwr_1453446_83223_429054_1603367_42.PNG?Id=1450686&lid=423454&idp=4402767&ps=4563223&circle=4&type=2&zw=264&zh=150&v=5&url=NA&uid= もご覧ください。訪問してくれてありがとう。

上記の内容では、最初にstrにhttp://www.example.net/animals/cat_345_456.JPGという値を割り当ててから、最初のメソッドを置き換えます。

この場合、予想される文字列が正しく置き換えられます。

は、それから、今、私はhttp://www.moredetails.com/example/imgs/nwr_1453446_83223_429054_1603367_42.PNG?Id=1450686&lid=423454&idp=4402767&ps=4563223&circle=4&type=2&zw=264&zh=150&v=5&url=NA&uid=の値とSTRを割り当て、私は最初の方法を交換呼び出します。

今回は置き換えられません。しかし、私はString.indexofメソッドを使用すると、その文字列のインデックス番号が正しく与えられます。

何か不足していますか?

助けてください。前もって感謝します。

+10

短いが完全な例では、これは*ずっと*に簡単であなたを助けることになるだろう。 –

+0

'Pattern.LITERAL'の代わりに' quoteReplacement(str) 'を実行するとどうなりますか? – OrangeDog

+0

あなたのサンプルは私のために働く。両方とも、第1と第2の交換。どのJavaバージョンを使用しますか? – morja

答えて

0

私はそれがうまくいかない場合、あなたの検索ターゲットにはパターンに合った特殊文字が含まれていると思います。例えば、()[] {}などです。このものはバックスラッシュを使用してエスケープする必要があります。しかし、ジョンはそうです。短い例が説明し、より多くのことを助けます。

+0

なぜ私は特殊文字をエスケープするためにPattern.literalを使ったのですか? – Roshan

1

あなたのコードはここに私のテストコードです...私のために正常に動作します: -

public class StringReplaceTest { 

    public static String replaceMe(String str) { 
     String cont = "For the pictures of animal please visit this site http://www.example.net/animals/cat_345_456.JPG . Also more details visit this link also http://www.moredetails.com/example/imgs/nwr_1453446_83223_429054_1603367_42.PNG?Id=1450686&lid=423454&idp=4402767&ps=4563223&circle=4&type=2&zw=264&zh=150&v=5&url=NA&uid= . Thanks visiting us."; 
     return Pattern.compile(str, Pattern.LITERAL).matcher(cont).replaceFirst(Matcher.quoteReplacement("replace string")); 
    } 

    @Test 
    public void testOne() { 
     String str = "http://www.moredetails.com/example/imgs/nwr_1453446_83223_429054_1603367_42.PNG?Id=1450686&lid=423454&idp=4402767&ps=4563223&circle=4&type=2&zw=264&zh=150&v=5&url=NA&uid="; 
     String actual = StringReplaceTest.replaceMe(str); 
     String expected = "For the pictures of animal please visit this site http://www.example.net/animals/cat_345_456.JPG . Also more details visit this link also replace string . Thanks visiting us."; 

     assertEquals(expected, actual); 
    } 

    @Test 
    public void testTwo() { 
     String str = "http://www.example.net/animals/cat_345_456.JPG"; 
     String actual = StringReplaceTest.replaceMe(str); 
     String expected = "For the pictures of animal please visit this site replace string . Also more details visit this link also http://www.moredetails.com/example/imgs/nwr_1453446_83223_429054_1603367_42.PNG?Id=1450686&lid=423454&idp=4402767&ps=4563223&circle=4&type=2&zw=264&zh=150&v=5&url=NA&uid= . Thanks visiting us."; 

     assertEquals(expected, actual); 
    } 

}