匹配不在引号内的模式

时间:2012-10-11 02:10:53

标签: c regex pcre

是否可以创建仅在匹配不在引号内时匹配的pcre正则表达式?我已经看到regex使用正向前瞻来断言在匹配后有{偶数',这几乎适用于我的情况,除了{{1}内可能出现不均匀数量的引号}和{

示例字符串:}

当它不在引号中时,有没有办法匹配foo.bar?

对于我的实际用例,我已经构建了一个解析器来执行此操作,但我首先尝试用正则表达式来解决它,并且想知道是否有一些我缺少的技巧。

1 个答案:

答案 0 :(得分:2)

如果它只是检查在引号之外发生的模式,那么解决方案很简单,你不需要用前瞻来玩游戏。 (复杂的前瞻始终是产生病态缓慢regexen的好方法。)在匹配之前知道偶数引号是有效的,因为知道它后面有偶数引号,前者是检查更容易,更快,因为它不需要在每个潜在的匹配上推测性地匹配整个字符串。不过,你确实需要非贪婪的重复,或者你会找到最后一个可能的匹配而不是第一个匹配。

这是一个简单的例子:

^(?:[^']*'[^']*')*?[^']*?foo\.bar
    |-paired 's|         |----------The pattern.
 |-shortest match-|
                   |----|
                   no quotes

但我认为你实际上也希望以某种方式使{}特别。我只是在猜测,因为你似乎没有明确表达它。如果括号可以嵌套,那么regexen就不合适了。 (“Regexen不能算数。”)

基于

的更新要求(在评论中)
  1. 行情隐藏大括号
  2. 大括号隐藏引号
  3. 大括号和引号都隐藏目标;和
  4. 大括号不嵌套
  5. 解决方案与我上面提出的解决方案没有太大区别;我们只需将{[^}]*}添加到初始模式中。这是一种可能性:

    ^(?:[^'{]*(?:'[^']*'|{[^}]*}))*?[^'{]*?foo\.bar
    

    这是一个(不太好)的测试; -o选项使grep显示匹配的部分,因此您可以看到每个匹配的结束位置:

    $ grep -oP "^(?:[^'{]*(?:'[^']*'|{[^}]*}))*?[^'{]*?foo\.bar" <<\EOF
    The target string is foo.bar and we should match the first foo.bar
    'foo.bar' does not match but foo.bar does
    Also, {foo.bar} doesn{'}t match, 'foo.bar' doesn{'}t match, {'foo.bar} doesn{'}t match, but foo.bar does
    Note that {braces don't {nest so the end is here} and foo.bar matches}   
    EOF
    

    产生:

    The target string is foo.bar
    'foo.bar' does not match but foo.bar
    Also, {foo.bar} doesn{'}t match, 'foo.bar' doesn{'}t match, {'foo.bar} doesn{'}t match, but foo.bar
    Note that {braces don't {nest so the end is here} and foo.bar