java - 如何使用带有撇号的 Java 单词边界?

标签 java regex

我试图删除列表中出现的所有单词,但当单词中有撇号时我遇到了麻烦。

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/

相关文章:

java - 提供wsdl url并获取该wsdl url中的所有请求

java - Spring Batch CommandLineJobRunner 在由企业调度程序运行时挂起

java - 如何在 xp 和 windows 7 上运行 SWT 应用程序

php - MySql 正则表达式匹配所有字符

java - 如何使用 String 的 replaceAll 在某些字符前面不替换

java - 在单元测试中,我们是否也测试父类(super class)?

javascript - 用于匹配 Javascript 中的工单 ID 的正则表达式模式(前缀-破折号-数字)

Java - 在两个字符串之间获取所有字符串的最佳方法? (正则表达式?)

python - 正则表达式将数值解析为不带星号和空格的数组

java - 在 Util 类中拥有私有(private)静态字段是不是很糟糕?