是否可以创建一个pcre regex,该regex只在匹配不在引号内时才匹配我已经看到regex在比赛后使用正向展望来断言有偶数个',这在我的情况下几乎可以工作,除了{}中可能出现不均匀的引号。
示例字符串:a 'asdfasdfasdf' {' ' ' as'df'sdf}foo.bar 'asdf' { a' } asdf asdf foo.bar 'asdf' {a'} asdf'asdffoo.barasdf' 'foo.bar' asdf {'''}
当foo.bar不在引号中时,是否有方法匹配它?
对于我的实际用例,我已经构造了一个解析器来完成这个任务,但是我首先尝试用regex来解决这个问题,并且想知道我是否遗漏了一些技巧。

最佳答案

如果它只是检查引号外出现的模式,那么解决方案很简单,不需要玩lookahead游戏(复杂的lookaheads始终是产生病态慢速regexen的一个好方法。)在匹配之前知道有偶数个引号和在匹配之后知道有偶数个引号是一样有效的,而且前者更容易和更快地检查,因为它不需要推测性地匹配整个字符串每一场潜在的比赛不过,你确实需要不贪婪的重复,否则你会找到最后一个可能的匹配,而不是第一个。
下面是一个简单的例子:

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

产生:
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

关于c - 匹配不在引号内的模式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12831198/

10-09 01:00
查看更多