Java ReplaceAll正则表达式与排除

时间:2012-12-06 05:08:55

标签: java regex replaceall

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

我尝试了以下内容:

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

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

<小时/> 修改:在此处提供反馈并进行一些调整后,这是解决我问题的有效方法。

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();
}

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

2 个答案:

答案 0 :(得分:2)

你需要使用负面的lookbehind而不是像这样的负向前瞻

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

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

答案 1 :(得分:-1)

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