我正在为 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/