[英]Matching until the first instance of a positive look-ahead assertion
我正在为Fountain创建一个Ruby解析器,这是一种用于编剧的markdown式纯文本语法。 这是一种无法实现我希望的模式。 我的模式是:紧跟着*markdown-style-emphasis*
。 我想用它来在初次强调之前提取内容
pattern = /(.+)(?=(?:\*.+\*))/
以下输出nil
因为没有匹配; 正面的前瞻性断言不满意。 没关系。
pattern.match("hello")
以下输出hello
。 它给了我一切,直到强调为止。 这就是我想要的。
pattern.match("hello *world*")[1]
以下输出hello *world*
。满足肯定的前瞻性断言,因为其中有一些内容,后跟一些markdown风格强调,但是这些内容包括markdown风格强调。 我原本希望它能满足,但事实并非如此。 有人知道解决此问题的方法吗?
pattern.match("hello *world* *lol*")[1]
我尝试将正向向前和向后反向组合起来以表示任何内容,然后再进行强调而不是强调,但是我认为这种方法是不可能的,因为回溯只能断言固定的长度模式。 一定有办法做到这一点,对吗?
我在这里推送了一种工作版本,其中一个测试被xit
标记为未决。
编辑 (感谢您的所有帮助, 现在测试通过了,谢谢:))
您可能会使您的正则表达式不贪心:
# ⇓
pattern = /(.+?)(?=(?:\*.+\*))/
puts pattern.match("hello *world* *lol*")[1]
#⇒ "hello "
对于这种特殊情况,我将使用ruby 预定义的全局$` :
pattern = /\*.+\*/ # match whatever is to be actually matched
#⇒ /\*.+\*/
▶ pattern.match("hello *world* *lol*")
#⇒ nil
▶ puts $` #` c’mon, parser
#⇒ "hello "
我认为,这更具语义。
@mudasobwa的第二个答案是最直接的。
不过,关于第一个答案,这是一种方法,但另一种(更有效的方法)是使用[^*]
。 除此之外,您还有多余的括号(捕获)会减慢比赛速度。
pattern = /[^*]+(?=\*.+\*)/
pattern.match("hello")
# => nil
pattern.match("hello *world*")[0]
# => "hello "
pattern.match("hello *world* *lol*")[0]
# => "hello "
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.