繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM