C 匹配不在引号内的模式

C 匹配不在引号内的模式,c,regex,pcre,C,Regex,Pcre,是否可以创建仅当匹配项不在引号内时才匹配的pcre正则表达式?我已经看到,使用积极的前瞻性来断言在比赛后有偶数的',这几乎适用于我的情况,除了{和}中可能出现不均匀的引号 示例字符串:a'asdfasdfasdf'{''as'df'sdf}foo.bar'asdf'{a'}asdf asdf foo.bar'asdf'{a'}asdf'asdffoo.barasdf''foo.bar'asdf{'} 当foo.bar不在引号中时,有什么方法可以匹配它吗 对于我的实际用例,我已经构建了一个解析器来

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

示例字符串:
a'asdfasdfasdf'{''as'df'sdf}foo.bar'asdf'{a'}asdf asdf foo.bar'asdf'{a'}asdf'asdffoo.barasdf''foo.bar'asdf{'}

当foo.bar不在引号中时,有什么方法可以匹配它吗


对于我的实际用例,我已经构建了一个解析器来实现这一点,但我首先尝试用正则表达式来解决它,并想知道是否有一些技巧我遗漏了。

如果它只是检查引号之外出现的模式,那么解决方案很简单,您不需要玩前瞻性游戏。(复杂的lookaheads通常是产生病理性慢正则表达式的一种好方法。)在匹配之前知道有偶数个引号与知道后面有偶数个引号一样有效,前者更容易、更快地检查,因为它不需要在每个可能的匹配上推测性地匹配整个字符串。不过,您确实需要非贪婪的重复,否则您将找到最后一个可能的匹配项,而不是第一个

下面是一个简单的例子:

^(?:[^']*'[^']*')*?[^']*?foo\.bar
    |-paired 's|         |----------The pattern.
 |-shortest match-|
                   |----|
                   no quotes
但我认为你实际上也想让
{}
在某种程度上变得特别。我只是在猜测,因为你似乎没有明确说明这一点。如果括号可以嵌套,那么regexen就是不合适的。(“Regexen不能计数。”)

根据更新后的要求(在评论中)

  • 引号隐藏大括号
  • 大括号隐藏引号
  • 大括号和引号都隐藏了目标;及
  • 牙套不能套
  • 这个解决方案与我上面提出的没有太大区别;我们只是将
    {[^}]*}
    添加到初始模式中。这里有一种可能性:

    ^(?:[^'{]*(?:'[^']*'|{[^}]*}))*?[^'{]*?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
    

    引号是否必须立即围绕要在引号中考虑的匹配?asd'asdfoo.bar'sdjk是否匹配?正则表达式是错误的工具。只需手动拆分引号上的字符串,然后在奇数部分使用正则表达式。@CaptainMurphy-asd'asdfoo.bar'sdjk中的foo.bar不匹配,因为它在引号中@陈雷蒙-我同意你的观点,我已经实施了一个适当的解决方案;这个问题更多的是想看看正则表达式大师是否知道一些我不知道的特性。谢谢你的回答。你所说的是有道理的,看起来是一个更好的解决方案,然后对这种情况使用前瞻。我想专门处理
    {}
    ,这一点您也是对的。如果
    {}
    '
    内,则忽略它们;但是,如果它们在引号外,则应忽略其中的任何引号,因为允许奇数。这更有意义吗?@user1736516这很有意义,但是:括号是否隐藏了目标模式以及引号,或者你能识别括号内的目标模式?还有,最重要的一点是:
    {
    短语是以后面的第一个
    }
    结尾,还是一直持续到下一个匹配的
    }
    ?在后一种情况下,没有正则表达式可以做你想做的。是的,括号隐藏了模式和引号。如果
    {
    位于单引号内,则根本不需要终止;否则,它将由以下第一个
    }
    @user1736516终止:好的,更新答案。我想这就够了。
    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