【问题标题】:Java ReplaceAll Regular Expression With ExclusionsJava 用排除项替换所有正则表达式
【发布时间】:2012-12-06 05:08:55
【问题描述】:

我正在尝试替换句子终止符的所有实例,例如“.”、“?”和“!”,但我不想替换像“dr.”这样的字符串。和“先生”。

我尝试了以下方法:

text = text.replaceAll("(?![mr|mrs|ms|dr])(\\s*[\\.\\?\\!]\\s*)", "\n");

...但这似乎不起作用。任何建议,将不胜感激。


编辑:在这里的反馈和一些 tweeking 之后,这是我的问题的有效解决方案。
private String convertText(String text) {
  text = text.replaceAll("\\s+", " ");
  text = text.replaceAll("[\n\r\\(\\)\"\\,\\:]", "");
  text = text.replaceAll("(?i)(?<!dr|mr|mrs|ms|jr|sr|\\s\\w)(\\s*[\\.\\?\\!\\;](?:\\s+|$))","\r\n");
  return text.trim();
}

代码将从文本摘录中提取所有*复合句和单个句子,删除所有标点符号和无关空格。
*有一些例外......

【问题讨论】:

  • 尝试从例外列表中删除括号 [](?!mr|mrs|ms|dr)。它们代表“字符集”,而不是您使用它们时的“完整字符串”。不知道它是否能完全解决您的问题,但值得一开始
  • 尝试这样做有几个问题。你将如何处理像J. H. Ronaldo says that the train is running on time.... Is he right? 这样的序列。
  • @Anthill,我添加了对忽略句点前面的单个字符的支持。这是正确的方法吗?还有更简单的方法吗?

标签: java regex replaceall


【解决方案1】:

你需要像这样使用否定的lookbehind而不是否定的lookahead

String x = "dr. house.";
System.out.println(x.replaceAll("(?<!mr|mrs|ms|dr)(\\s*[\\.\\?\\!]\\s*)","\n"));

mr/dr/ms/mrs 的列表也不应该在字符类中。

【讨论】:

  • 我是如此接近,我隐约记得消极的后视。谢谢。
【解决方案2】:

您需要有一个完整的字母组合列表,允许在. 之前。然后,您可以将dr.mr.(以及任何其他允许的组合)替换为dr28dsj458sjmr28dsj458sj 之类的独特内容。理想情况下,您应该检查您的临时替代值是否存在于文档中的其他位置。然后遍历并删除所有句子终止符,然后再次遍历并再次将出现的28dsj458sj 替换为.

【讨论】:

  • 我喜欢这种骇人听闻的解决方法,但它可能会降低性能。消极的后视是我想要的。感谢您的宝贵时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-25
  • 1970-01-01
  • 1970-01-01
  • 2010-12-24
相关资源
最近更新 更多