我知道*
是什么,?
是什么。
但是,我不明白*?
是什么。我知道它用于使“贪婪”*运算符变得懒惰,但是,如果*
为zero or more times
且?
为one or one time
,那么该怎么读?
谢谢。
修改
我强调我知道*
,?
,greedy
和lazy
是什么。
答案 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)
*
表示“匹配此*
之前的表达任何次数(包括零)”
?
表示“匹配此?
零或一个时间之前的表达式”
贪婪与懒惰意味着表达式倾向于尽快停止匹配,而不是尽可能地获得最长匹配。
*?
是否意味着*
,但是懒惰,取决于您的正则表达式引擎。