【发布时间】: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