gpt4 book ai didi

c - 匹配不在引号内的模式

转载 作者:太空宇宙 更新时间:2023-11-03 23:32:15 26 4
gpt4 key购买 nike

是否可以创建一个仅在匹配项不在引号内时才匹配的 pcre 正则表达式?我看过regex使用正前瞻断言匹配后有偶数个 ' ,这在我的情况下几乎有效,除了 { 内部可能出现奇数个引号和

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

有什么方法可以匹配不在引号中的 foo.bar 吗?

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

最佳答案

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

这是一个简单的例子:

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

但我认为您实际上还想以某种方式使 {} 变得特别。我只是在猜测,因为你似乎并没有明确说明。如果括号可以嵌套,那么正则表达式就不合适了。 (“Regexen 不能计数。”)

基于更新的要求(在评论中)

  1. 引号隐藏大括号
  2. 大括号隐藏引号
  3. 大括号和引号都隐藏了目标;和
  4. 大括号不嵌套

解决方案与我上面提出的方案没有太大区别;我们只是将 {[^}]*} 添加到初始模式中。这是一种可能性:

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com