【问题标题】:Regex lookahead/lookbehind comments正则表达式前瞻/后视评论
【发布时间】:2014-07-05 15:30:18
【问题描述】:

我有一个来自配置文件的 sn-p,我需要能够匹配指定的字符串引用内容,但只有当它们没有被注释掉时,这是我当前的正则表达式:

(?<!=#)test\.this\.regex\s+\"(.*?)\"

我觉得这应该可行吗?我是这样读的:

(?&lt;!=#) 向后查找以确保其前面没有 #

test\.this\.regex\s+\"(.*?)\" 匹配 test.this.regex "sup1"

这里是配置 sn-p

    test.this.regex "sup1" hi |sup1| # test.this.regex "sup3" hi |sup3|
# test.this.regex "sup2" do |sup2|
    test.this.regex "sup2" do |sup2|

但我的正则表达式匹配所有 4 次:

Match 1
1.  sup1
Match 2
1.  sup3
Match 3
1.  sup2
Match 4
1.  sup2

【问题讨论】:

  • 您使用哪种语言/工具?
  • # 之后似乎有一个空格,您没有在正则表达式中考虑。
  • 否定lookbehind的语法是(?&lt;!...),而不是(?&lt;!=...)
  • @anubhava 我正在使用这个rubular.com,因为它支持lookaheads/lookbehinds
  • @bruchowski:用什么语言标记总是好的。标记为rubyrubularnegative-lookbehind。根据需要重新标记。

标签: ruby regex negative-lookbehind rubular


【解决方案1】:

如果您的问题体现在第一句话中(而不是专门针对外观),您为什么不直接使用 String#split 和您的正则表达式而不是后视?

def doit(str)
  r = /test\.this\.regex\s+\"(.*?)\"/
  str.split('#').first[r,1]
end

doit('test.this.regex "sup1" hi |sup1| # test.this.regex "sup3" hi |sup3|')
  #=> "sup1"
doit('# test.this.regex "sup2" do |sup2|')
  #=> nil
doit('test.this.regex "sup2" do |sup2|')
  #=> "sup2"

【讨论】:

    【解决方案2】:

    你可以使用这个 PCRE 正则表达式:

    /(?># *(*SKIP)(*FAIL)|(?:^|\s))test\.this\.regex\s+\"[^"]*\"/
    

    Working Demo

    • (*FAIL) 表现得像一个失败的否定断言,是 (?!) 的同义词
    • (*SKIP) 定义了一个点,当子模式稍后失败时,正则表达式引擎不允许回溯。
    • (*SKIP)(*FAIL) 一起提供了一个很好的限制替代方案,您不能在上面的正则表达式中使用可变长度的lookbehinf。

    更新:不确定 ruby​​ 是否支持(*SKIP)(*FAIL),所以给出这个替代版本:

    (?:# *test\.this\.regex\s+\"[^"]*\"|\b(test\.this\.regex\s+\"[^"]*\"))
    

    并寻找非空匹配组#1。

    Working Demo 2

    【讨论】:

    • 如果 # 后面有多个空格,则会中断
    • 在你的问题中澄清这一点,这正是我问你使用哪种语言的原因?
    • 我以为我在第一句话中就做到了,如果您错过了,请见谅;我还注意到我正在使用 Ruby 的正则表达式实现。如果#test.this.regex 之间有任何内容,它应该匹配,因为这意味着它是一条评论,我想忽略该匹配
    • 查看更新的答案。实际上,除了正则表达式之外,您的问题还需要使用语言/工具进行标记。
    • (#)?.*test\.this\.regex\s+\"(.*)\" 无济于事,因为它会匹配两个字符串,并且您在后视中不能有动态长度。
    猜你喜欢
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    相关资源
    最近更新 更多