ruby - 标点符号模式的正则表达式前瞻/回顾

标签 ruby regex

使用 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

它是如何工作的: 正则表达式将在字符串中的每个位置检查以下内容

  1. “quote”形式的带引号的字符串,可以包含任何内容,直到结束引号。您还可以使用转义引号,例如 "hell\"o"
  2. 匹配任意字母,后跟一个点,再跟另一个字母,最后一个点。这是为了匹配您的 U.S. 等特殊情况。
  3. 匹配除标点符号之外的所有其他内容 .?!
  4. 重复此操作,直到到达标点字符。

关于ruby - 标点符号模式的正则表达式前瞻/回顾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28254922/

相关文章:

mysql - 归档整个 Rails 站点

c++ - 将 tr1::regex 与 unicode 字符串一起使用时出现问题

regex - 带有可选分隔符的最佳 UUID RegEx

css - 在时尚中排除网站的子文件夹?

ruby - Puppet 仪表板 - 禁止目录索引

ruby-on-rails - rails 4 在初始化器中使用应用程序助手

ruby-on-rails - rake 数据库 :setup results in fe_sendauth no password supplied

ruby-on-rails - 在 Rails 中使用数据库列别名时出现 NoMethodError

javascript - 有没有办法将代码动态添加到正则表达式匹配的每个实例?

regex - 检查每个单词的第一个字符是否为大写