是否可以创建仅在匹配不在引号内时匹配的pcre正则表达式?我已经看到regex使用正向前瞻来断言在匹配后有{偶数'
,这几乎适用于我的情况,除了{{1}内可能出现不均匀数量的引号}和{
。
示例字符串:}
当它不在引号中时,有没有办法匹配foo.bar?
对于我的实际用例,我已经构建了一个解析器来执行此操作,但我首先尝试用正则表达式来解决它,并且想知道是否有一些我缺少的技巧。
答案 0 :(得分:2)
如果它只是检查在引号之外发生的模式,那么解决方案很简单,你不需要用前瞻来玩游戏。 (复杂的前瞻始终是产生病态缓慢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