我正在尝试从字符串中替换一些单词并使用以下代码
someMoreString = someString.replaceAll("\\b(shoe||apple|search|employee|expert)\\b", "");
工作正常。今天我发现它并没有取代某些词语。替换列表很长
我不能验证所有。但是,我发现search
字在文件中从未被替换过。我怀疑可能会有更多像这样的案件。
知道为什么会这样吗?我怎么能阻止这个?
谢谢大家的回答。我找到了解决方案: - )
我在替换字符串中添加了两个条形符号,导致了这个问题。 例如:
someMoreString = someString.replaceAll(“\ b(shoe || apple | search | employee | expert)\ b”,“”);
我不知道,为什么它没有给出错误以及为什么它取代了一些词。
答案 0 :(得分:3)
双管道的问题在于它会寻找要替换的匹配项,因此会替换与第一个单词(“shoe”)匹配的任何单个匹配项,如果它不起作用则查找下一个可能的匹配项,这是一个空字符串(在两个管道之间)。所以你会发现这些匹配并用空字符串替换它们(具有讽刺意味)。当找到该位置的匹配时,它会切换到下一个潜在位置,并且不会检查该位置的其他单词。
很可能,双管之后的任何单词都没有被替换。
它没有产生错误,因为语法有效,并且在合法的情况下你需要查找空字符串来插入字符。
保留其他人遇到的类似错误。
这显然有效,所以只剩下几个选项:
Pattern.compile(regex, flags).matcher(str).replaceAll(repl)
代替,使用CASE_INSENTIVE标志来编译pattern)请提供更多代码和您的输入摘录。
如果从套接字读取,请确保为请求指定正确的标头,并使用有效的内容类型和字符编码。请确保您没有在源文件和输入数据文件上使用奇怪的编码。
这部分重写了我就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", ""));
}
}