我试图删除列表中出现的所有单词,但当单词中有撇号时我遇到了麻烦。
String phrase="bob has a bike and bob's bike is red";
String word="bob";
phrase=phrase.replaceAll("\\b"+word+"\\b","");
System.out.println(phrase);
输出:
有一辆自行车并且 的自行车是红色的
我想要的是
有一辆自行车,bob 的自行车是红色的
我对正则表达式的了解有限,所以我猜想有一个解决方案,但我现在还不足以创建正则表达式来处理撇号。此外,我希望它与破折号一起使用,因此短语 the new mail is e-mail
只会替换第一次出现的邮件。
最佳答案
这完全取决于您对“词”的理解。也许你最好定义你所理解的单词分隔符:例如,空格、逗号....并写成
phrase=phrase.replaceAll("([ \\s,.;])" + Pattern.quote(word)+ "([ \\s,.;])","$1$2");
但是你必须额外检查字符串开头和结尾处的匹配项 例如:
String phrase="bob has a bike bob, bob and boba bob's bike is red and \"bob\" stuff.";
String word="bob";
phrase=phrase.replaceAll("([\\s,.;])" + Pattern.quote(word) + "([\\s,.;])","$1$2");
System.out.println(phrase);
打印这个
bob has a bike , and boba bob's bike is red and "bob" stuff.
更新:如果你坚持使用\b
,考虑到“单词边界”理解Unicode,你也可以做这个卑鄙的把戏:替换所有出现的'
通过一些您确定不会出现在您的文本中的 Unicode 字母,然后进行反向替换。示例:
String phrase="bob has a bike bob, bob and boba bob's bike is red and \"bob\" stuff.";
String word="bob";
phrase= phrase.replace("'","ñ").replace('"','ö');
phrase=phrase.replaceAll("\\b" + Pattern.quote(word) + "\\b","");
phrase= phrase.replace('ö','"').replace("ñ","'");
System.out.println(phrase);
更新:总结下面的一些评论:人们会期望 \w
和 \b
对哪个是“单词字符”有相同的概念,几乎每个正则表达式方言都可以。好吧,Java 没有:\w
考虑 ASCII,\b
考虑 Unicode。这是一个丑陋的矛盾,我同意。
更新 2:从 Java 7 开始(如评论中所指出的)UNICODE_CHARACTER_CLASS标志允许指定一致的 Unicode-only 行为,参见例如 here .
关于java - 如何使用带有撇号的 Java 单词边界?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4769652/