【问题标题】:Java replace allJava全部替换
【发布时间】:2011-05-27 23:59:46
【问题描述】:

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

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

它工作正常。今天我发现它并不能代替一些单词。替换列表很长 我无法验证所有。但是,我发现 search 单词从未在文件中被替换。我怀疑还会有更多这样的案例。

知道为什么会这样吗?我怎样才能阻止这种情况?

编辑

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

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

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

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

【问题讨论】:

  • 我建议找一个可重复的测试用例。
  • 是案例问题吗?你能提供一个失败的短字符串吗?

标签: java regex string


【解决方案1】:

更新问题后回答

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

很可能,双竖线之后的任何单词都从未被替换过。

它没有产生错误,因为语法是有效的,并且在某些合法的情况下,您希望查找空字符串来插入字符。


原答案

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

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

  1. 您需要分配返回值(字符串在Java中是不可变的as also mentioned by Ehran
  2. 字符串中有一些不可打印的字符;
  3. 读取输入并比较时存在编码问题;
  4. 你的词被没有记录边界的东西分隔。
  5. 您需要不区分大小写的搜索(改用 Pattern.compile(regex, flags).matcher(str).replaceAll(repl),并带有 CASE_INSENTIVE 标志来编译 pattern
  6. 我们看不到的其他地方有问题,因为您提供了:
    • 不是整个代码
    • 也不是输入数据。

请提供更多代码和您的输入摘录。

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

这是我在这个问题上给出的关于 why the java String.contains method does not return found matches correctly 的另一个答案的部分重写。

【讨论】:

  • 感谢您的回答。我认为前两个可能是原因。因为它只发生在我读取文件然后搜索替换时。如何避免/控制它们?
  • 如果您使用的是 unix/linux 机器,请尝试使用 cat -e MY_FILE 来显示不可打印字符,以检查源文件和输入文件。
  • @user751637:例如,这个“文本”文件中是否有不间断的空格?
  • @user751637:请在此处提供您的输入数据作为文本或上传到其他地方的文件,并提供更多代码,以便我们也可以看到您如何阅读输入。我们现在几次询问更多细节。我用更多的可能性和建议更新了我的答案,但如果没有更深入的数据挖掘将很困难。
  • Haylen,感谢您的快速而翔实的回答。我更新了我的问题。我找到了解决方案,但我不知道为什么以及如何!能否请您说明一下这个问题?
【解决方案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", ""));
    } 

}

【讨论】:

  • 该死,你打败了我我想,我会在我的回答中感谢你。
  • 谢谢,我已经将它分配给一个字符串。我更新了我的问题
猜你喜欢
  • 2014-06-17
  • 2016-06-20
  • 1970-01-01
  • 1970-01-01
  • 2012-11-27
  • 2015-03-06
  • 2016-02-23
  • 1970-01-01
  • 2019-12-19
相关资源
最近更新 更多