正则表达式:如何解释*?

时间:2011-04-05 21:29:28

标签: regex operators

我知道*是什么,?是什么。
但是,我不明白*?是什么。我知道它用于使“贪婪”*运算符变得懒惰,但是,如果*zero or more times?one or one time,那么该怎么读?

谢谢。

修改 我强调我知道*?greedylazy是什么。

5 个答案:

答案 0 :(得分:3)

这是一种用于扩展regexp语法而不添加更多特殊字符的技巧。当然,在“零或更多”之后说“零或一”没有意义......因此组合*?应该被读作单个标记,意思是“零或更多 - 不贪婪”。以类似的方式,+?应该被理解为单个标记,意思是“一个或多个 - 不是贪婪的”。

贪婪永远不会改变匹配的字符串和不匹配的字符串,但它可能会改变找到的匹配项。例如,(AB*?)B+的第1组与A中的ABBBBB匹配,但(AB*)B+的第1组匹配同一字符串中的ABBBB

“奇怪之处”中的问号也用于多个正则表达式引擎中可用的其他特殊组合,例如:

(?=...)     zero-width positive lookahead assertion
(?!...)     zero-width negative lookahead assertion
(?:...)     non-tagging group

如你所见,它们都以(?开头,显然问号不能代表“零或一”(我们在表达式的开头,零或一个什么?)。

答案 1 :(得分:1)

*zero or more times?zero or one times,但*?zero or more times, not greedily。这是它自己的实体。

答案 2 :(得分:1)

考虑与AAABAAAAAAAAB/.*B/匹配的字符串/.*?B/。第一个找到整个字符串(贪婪),第二个停止的A尽可能少。

(在Perl或Java或PHP等提取中,这很重要;如果您只是在vi中搜索,它会在第一个A处停止。)

?本身匹配0或1次。但这与*?用法不同。

(这基本上就是Perl风格的正则表达式。有些正则表达式可能表现不同,但大多数都是这样。)

这是一个小小的Perl演示:

$a = "AAAAAAAAAAABAAAAAAB";

print " first: ";
print $1 if($a =~ /(.*B)/);

print "\nsecond: ";
print $1 if($a =~ /(.*?B)/);

print "\n";

答案 3 :(得分:1)

阅读本文 - Watch Out for The Greediness!

在你的例子中,什么时候?在*之后使用,它使*懒惰,所以如果你使用上面链接中的例子:

这个贪婪的正则表达式 - <.*&gt; 给这个字符串 “这是<EM&gt;首次</EM&gt;测试” 会匹配 <EM&gt;首先</EM&GT; (这很贪婪 - 它花了最大(最宽)的比赛)

这个懒惰的正则表达式 - &lt;。*?&gt; 给这个字符串 “这是<EM&gt;首次</EM&gt;测试” 会匹配 <EM&GT; (这很懒 - 它可以用最小(最窄)的比赛)

答案 4 :(得分:0)

*表示“匹配此*之前的表达任何次数(包括零)”

?表示“匹配此? 零或一个时间之前的表达式”

贪婪与懒惰意味着表达式倾向于尽快停止匹配,而不是尽可能地获得最长匹配。

*?是否意味着*,但是懒惰,取决于您的正则表达式引擎。