java - 使用正则表达式来匹配内容或分隔符哪个更好?

标签 java regex

举一个具体的例子,我想将文本文档分成句子。我正在考虑使用以下正则表达式(仍然可能需要调整):

  • [!?][\s]*|[.\n][!?\s]+[.!?\s]* 匹配标点符号/空格(句子之间的内容) - 分隔符)
  • (.|\n)*?([!?.]\s+|[\n]{2,}|$):捕获后跟标点符号或换行符的任何字符串(完整句子-我想要的内容本身)

一般来说,首选哪种方法?在我的特定上下文中,我想跟踪每个句子的开始和结束索引,所以我不能做像 String#split 这样简单的事情.

谢谢。

最佳答案

假设您打算使用普通的 PatternMatcher 处理,第一个正则表达式通常会捕获非常少的字符(最多结束标点符号和一些空白字符)因此应该是最快的。如果您正在解析一个非常大的文档,这可能会产生影响。

但是,提取每个句子的开始和结束索引可能会比较笨拙,因为您需要来自两个连续匹配的信息才能分隔整个句子。第二个正则表达式直接将句子映射到单个匹配项并启用最简单的代码。

所以这里没有免费的午餐。两者都可以完成工作,尽管您可以根据您的目标文档类型使它们更加强大。特别要注意句子中间出现意外的标点符号,例如:

... the "?" character can be used to...

关于java - 使用正则表达式来匹配内容或分隔符哪个更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31521925/

相关文章:

java - android.database.CursorIndexOutOfBoundsException : No idea why

java - 条件语句在 if-else-if 阶梯的两个部分都为真

java - 循环遍历 InputStream 截断数据

regex - 使用 postgres regexp_replace 将字符串列表替换为始终相同的字符串

python - nltk 标记化测量单位

java - 将 JSON 对象反序列化为对象数组以进行 Retrofit

java - ReSTLet客户端如何处理媒体类型的请求?

JavaScript 正则表达式,带星号的字母数字

python - 正则表达式替换所有除非行尾($ in [] issue)

javascript - 匹配具有唯一数字的字母数字词(不是仅限数字的词)