String.replaceFirst有时不替换期望的字符串

时间:2011-02-07 10:12:08

标签: java regex

使用java我尝试用其他字符串替换某些字符串的出现。它适用于大多数情况。但有时某些字符串不会在给定内容中被替换。

当我使用indexOf方法搜索给定内容中的某个字符串时,我可以正确地获取该String的索引。但是,当我使用replaceFirst方法替换该String时,操作以失败结束。

然后我尝试使用以下替换以逃避转义字符。

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=   。谢谢访问我们。

在上面的内容首先我指定值为http://www.example.net/animals/cat_345_456.JPG的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=的str并且我调用replace first method。

但这一次它没有被取代。但是当我使用String.indexof方法时,它正确地给出了该String的索引号。

我错过了什么吗?

请帮忙。提前谢谢。

2 个答案:

答案 0 :(得分: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);
    }

}

答案 1 :(得分:0)

我相信如果它不起作用,你的搜索目标会包含一些对模式有意义的特殊字符。例如()[] {}等。必须使用反斜杠转义这些东西。但乔恩是对的:简短的例子解释并帮助更多。