使用 Ruby,我想找到一个能够正确识别句子边界的正则表达式,我将其定义为任何以 [.!?] 结尾的字符串,除非这些标点符号存在于引号内,如
My friend said "John isn't here!" and then he left.
我当前不足的代码是:
text = para.text.scan(/[^\.!?]+[(?<!(.?!)\"|.!?] /).map(&:strip)
我已经仔细研究了正则表达式文档,但似乎仍然无法正确理解回溯/前瞻。
最佳答案
这样的事情怎么样?
/(?:"(?>[^"]|\\.)+"|[a-z]\.[a-z]\.|[^.?!])+[!.?]/gi
演示:https://regex101.com/r/bJ8hM5/2
它是如何工作的: 正则表达式将在字符串中的每个位置检查以下内容
- “quote”形式的带引号的字符串,可以包含任何内容,直到结束引号。您还可以使用转义引号,例如
"hell\"o"
。 - 匹配任意字母,后跟一个点,再跟另一个字母,最后一个点。这是为了匹配您的
U.S.
等特殊情况。 - 匹配除标点符号之外的所有其他内容
.?!
。 - 重复此操作,直到到达标点字符。
关于ruby - 标点符号模式的正则表达式前瞻/回顾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28254922/