Java取代全部

时间:2011-05-27 23:59:47

标签: java regex string

我正在尝试从字符串中替换一些单词并使用以下代码

someMoreString = someString.replaceAll("\\b(shoe||apple|search|employee|expert)\\b", "");

工作正常。今天我发现它并没有取代某些词语。替换列表很长 我不能验证所有。但是,我发现search字在文件中从未被替换过。我怀疑可能会有更多像这样的案件。

知道为什么会这样吗?我怎么能阻止这个?

修改

谢谢大家的回答。我找到了解决方案: - )

我在替换字符串中添加了两个条形符号,导致了这个问题。 例如:

someMoreString = someString.replaceAll(“\ b(shoe || apple | search | employee | expert)\ b”,“”);

我不知道,为什么它没有给出错误以及为什么它取代了一些词。

2 个答案:

答案 0 :(得分:3)

更新问题后的答案

双管道的问题在于它会寻找要替换的匹配项,因此会替换与第一个单词(“shoe”)匹配的任何单个匹配项,如果它不起作用则查找下一个可能的匹配项,这是一个空字符串(在两个管道之间)。所以你会发现这些匹配并用空字符串替换它们(具有讽刺意味)。当找到该位置的匹配时,它会切换到下一个潜在位置,并且不会检查该位置的其他单词。

很可能,双管之后的任何单词都没有被替换。

它没有产生错误,因为语法有效,并且在合法的情况下你需要查找空字符串来插入字符。


原始答案

保留其他人遇到的类似错误。

这显然有效,所以只剩下几个选项:

  1. 您需要指定返回值(字符串不可变在Java中,as also mentioned by Ehran
  2. 字符串中有一些不可打印的字符;
  3. 阅读输入并进行比较时存在编码问题;
  4. 你的单词是由没有注册边界的东西分隔的。
  5. 您想要一个不区分大小写的搜索(使用Pattern.compile(regex, flags).matcher(str).replaceAll(repl)代替,使用CASE_INSENTIVE标志来编译pattern
  6. 在其他地方出现了一些我们无法看到的错误,因为你给出了:
    • 既不是整个代码
    • 也不是输入数据。
  7. 请提供更多代码和您的输入摘录。

    如果从套接字读取,请确保为请求指定正确的标头,并使用有效的内容类型和字符编码。请确保您没有在源文件和输入数据文件上使用奇怪的编码。

    这部分重写了我就why the java String.contains method does not return found matches correctly这个问题提出的另一个答案。

答案 1 :(得分:2)

“今天我发现它并没有取代某些词语”

我认为如果没有作业,你就不会真正替换这些词,也不会替换搜索词或其他词。字符串操作是不可变的,试试这个:

someString = someString.replaceAll("\\b(apple|search|employee|expert)\\b", "");

样本测试:

public class StringTests {

    @Test
    public void replaceAllTest() {      
        String someString ="bla bla search bla";
        System.out.println(someString);
        someString.replaceAll("\\b(apple|search|employee|expert)\\b", "");
        System.out.println(someString);
        someString = someString.replaceAll("\\b(apple|search|employee|expert)\\b", "");
        System.out.println(someString);

        assertEquals(someString, someString.replaceAll("\\b(apple|search|employee|expert)\\b", ""));
    } 

}