首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >非贪婪行为的Regex匹配

非贪婪行为的Regex匹配
EN

Stack Overflow用户
提问于 2016-12-06 01:52:34
回答 1查看 138关注 0票数 3

我发现,非贪婪的regex匹配只有当锚定在前面,而不是最后才变成非贪婪的:

代码语言:javascript
复制
$ echo abcabcabc | perl -ne 'print $1 if /^(a.*c)/'
abcabcabc
# OK, greedy match

$ echo abcabcabc | perl -ne 'print $1 if /^(a.*?c)/'
abc
# YES! non-greedy match

现在看看这个,当锚定到最后的时候:

代码语言:javascript
复制
$ echo abcabcabc | perl -ne 'print $1 if /(a.*c)$/'
abcabcabc
# OK, greedy match

$ echo abcabcabc | perl -ne 'print $1 if /(a.*?c)$/'
abcabcabc
# what, non-greedy become greedy?

为什么会这样呢?为什么它不像以前那样打印abc

(在我的Go代码中发现了这个问题,但为了简单起见,在Perl中作了说明)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-06 02:53:52

$ echo a perl -ne‘打印$1如果/(a*?c)$/’abcabcabc #什么,非贪婪变成贪婪?

非贪婪意味着它将匹配当前位置上可能最少的字符,从而使整个模式匹配。

在将a匹配到0位置之后,bcabcab是在1位置可以匹配的最少的.*?,但仍然满足模式的其余部分。

详细的"abcabcabc" = /a.*?c$/

  1. 在pos 0,a匹配1个字符(a)。
    1. 在pos 1处,.*?匹配0个字符(空字符串)。
      1. 在pos 1时,c无法匹配。回溯!

代码语言:javascript
复制
1. At pos 1, `.*?` matches 1 char (`b`).  
    1. At pos 2, `c` matches 1 char (`c`).  
        1. At pos 3, `$` fails to match. Backtrack!

代码语言:javascript
复制
1. At pos 1, `.*?` matches 2 chars (`bc`).  
    1. At pos 1, `c` fails to match. Backtrack!

代码语言:javascript
复制
1. ...
2. At pos 1, `.*?` matches 7 chars (`bcabcab`).  
    1. At pos 8, `c` matches 1 char (`c`).  
        1. At pos 9, `$` matches 0 chars (empty string). Match successful!

详细的"abcabcabc" = /a.*c$/ (用于对比):

  1. 在pos 0,a匹配1个字符(a)。
    1. 在pos 1,.*匹配8个字符(abcabcabc)。
      1. 在pos 9时,c无法匹配。回溯!

代码语言:javascript
复制
1. At pos 1, `.*` matches 7 chars (`abcabcab`).  
    1. At pos 8, `c` matches 1 char (`c`).  
        1. At pos 9, `$` matches 0 chars (empty string). Match successful!

提示:避免使用两种非贪婪修饰符的模式。除非您使用它们作为优化,否则它们很有可能匹配您不希望它们匹配的东西。这在这里是相关的,因为模式隐式地从\G(?s:.*?)\K开始(除非由领先的^\A\G取消)。

您想要的是以下内容之一:

代码语言:javascript
复制
/a[^a]*c$/
/a[^c]*c$/
/a[^ac]*c$/

您还可以使用以下内容之一:

代码语言:javascript
复制
/a(?:(?!a).)c$/s
/a(?:(?!c).)c$/s
/a(?:(?!a|c).)c$/s

在这种情况下使用后三个字符将是低效和不可读的,但它们的边界将超过一个字符。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40986527

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档