【问题标题】:REGEX to separate sentences正则表达式分隔句子
【发布时间】:2015-06-29 18:08:54
【问题描述】:

几天前,我asked here 寻求帮助。我试图创建一个正则表达式来分隔文本中的句子,并在一些好的答案之后,成功地将它放在一起:

/(("[^\n"]*\n)|("[^\n."]*\.[^\n"]*")|(?=[^\n ])("[^\n."]*")?([^\n. ]| (?!"))*( "[^\n."]*"([^\n. ]| (?!"))*)*( "[^\n"]*("|[^\n](?=\n))|\.|[^\n](?=\n)|$))/gi

符合我的全部要求:

  • 句子以句点.或换行符\n结尾

  • 一个句子可以包含任意数量的引号

  • 引号以空格和双引号"开头,除非出现在句首,在这种情况下空格应被忽略

  • 引号以双引号结尾"

  • 引用可以有任意数量的句点.,而不会立即结束包含它的句子。如果在引号中找到句点,则句子将等到引号以双引号 " 结束时结束

  • 遇到换行符\n时,引号立即结束,在这种情况下,包含引号的句子也立即结束

这是我的测试用例:REGEX101

现在这只是一个开始,我打算扩展它。当它们以数字形式使用时,我将不得不转义句点(例如5.4)。我可能还想将括号对 () 视为引号。

但我开始严重怀疑我的方法。正则表达式是要走的路吗?我之前的帖子中有人建议使用解析器。我做了一些研究,但我不明白网络上对正则表达式的仇恨。他们完全按照预期完成工作。如果有另一种更好/更快/更清洁的方式,我希望能提供一些关于如何实现这一目标的指导。

【问题讨论】:

  • 如果regex 完全符合您的要求,那么您为什么要严重怀疑您的方法呢?是的,有很多人相信只有一种方法可以做事,但不要因此而气馁。也许regex 不是针对这个特定目的的正确方法——也许是。除非有令人信服的内容要告诉您,否则请使用任何似乎对您有效的方法。
  • 你觉得你当前的正则表达式可读吗?复杂的正则表达式不被看不起是因为它们不能完成任务,而是因为它们很快就会失控。

标签: javascript regex


【解决方案1】:

你的第一个正则表达式看起来很复杂,我相信下面的正则表达式应该涵盖相同的情况:

(?:"[^"\r\n]+"|[^.\r\n])+[.\r\n]

Debuggex上的可视化

regex101上的演示


现在满足您的新要求:

(?:"[^"\r\n]+"|\([^)\r\n]+\)|\d\.\d|[^.\r\n])+[.\r\n]

Debuggex上的可视化

regex101上的演示

【讨论】:

  • 谢谢,但我一直在寻找正则表达式的替代方法,如果有的话,而且你的实现不满足所有要求,"Send them away. I never asked them here." Mya looked nonplussed. 给你一个匹配,但应该有 2 个。测试用例我有 31 个匹配项,你有 26 个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-24
  • 2012-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多