ruby - 匹配到第一个肯定的前瞻断言实例

标签 ruby regex

我正在为 Fountain 制作一个 Ruby 解析器,一种类似于 markdown 的纯文本语法,适用于剧本。这是一个没有做我希望它会做的事情的模式。我的模式是:东西后跟 *markdown-style-emphasis*。我想用它在第一次强调之前提取内容

pattern = /(.+)(?=(?:\*.+\*))/
  • 以下输出 nil 因为没有匹配;积极的前瞻断言是不满意的。没关系。

    pattern.match("hello")
    
  • 以下输出 hello。它给了我一切,直到重点。这就是我想要的。

    pattern.match("hello *world*")[1]
    
  • 以下输出 hello *world*。积极的前瞻断言是满足的,因为后面有一些 markdown-style-emphasis 的东西,但这些东西包括 markdown style emphasis。我希望它能在一开始就得到满足,但事实并非如此。有谁知道解决这个问题的方法吗?

    pattern.match("hello *world* *lol*")[1]
    

我尝试结合正面前瞻和负面回顾来表达任何紧随其后的强调,但之前没有强调,但我认为这种方法是不可能的,因为回顾只能断言在固定长度的模式上。一定有办法做到这一点,对吧?

我推出了一个工作版本 here , 其中一个测试被标记为待处理 xit

编辑(测试 now 通过感谢您的所有帮助,谢谢 :))

最佳答案

你可能会让你的正则表达式不贪心:

#             ⇓
pattern = /(.+?)(?=(?:\*.+\*))/

puts pattern.match("hello *world* *lol*")[1]
#⇒ "hello "

对于这种特殊情况,我会使用 ruby​​ predefined global $` :

pattern = /\*.+\*/ # match whatever is to be actually matched
#⇒ /\*.+\*/
▶ pattern.match("hello *world* *lol*")
#⇒ nil
▶ puts $`  #` c’mon, parser
#⇒ "hello "

在我看来,这更符合语义。

关于ruby - 匹配到第一个肯定的前瞻断言实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32687499/

相关文章:

mysql - Ruby On Rails 保存到数据库多个表

ruby-on-rails - 在 rails 中解析带有德语字符的电子邮件内容

ruby-on-rails - 我应该使用哪些插件/gem 在 Rails 3 中即时动态生成缩略图?

来自两个不同大小数组的 Ruby 数组?

regex - R - 提取所有匹配模式的字符串并创建关系表

javascript - 尝试使用正则表达式复制 SID 时获取 NULL 结果

regex - .htaccess 如果 URL 错误,请执行某些操作

ruby - Rspec:访问 Klass.any_instance.stub block 内的实例

regex - PowerShell -match 与 -like

正则表达式匹配到文本结束