Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 正则表达式:如何解释*?_Regex_Operators - Fatal编程技术网

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

Regex 正则表达式:如何解释*?,regex,operators,Regex,Operators,我知道什么是*,什么是?。 然而,我不明白什么是*?。我知道它被用来使“贪婪”操作符成为懒惰的操作符,但是,如果*是零次或多次,并且?是一次或一次,该如何读取呢 多谢各位 编辑: 我强调我知道什么是*,?,贪婪的和懒惰的。*是零次或多次的,是零次或一次的,但是*?是零次或多次的,而不是贪婪的。它是它自己的实体。考虑字符串aaabaaaaab与/.*B/匹配,而不是/.*B/匹配。第一个查找整个字符串(贪婪),第二个查找尽可能少的A (在Perl、Java或PHP等提取中,这很重要;如果您只是在v

我知道什么是
*
,什么是

然而,我不明白什么是
*?
。我知道它被用来使“贪婪”操作符成为懒惰的操作符,但是,如果
*
零次或多次
,并且
一次或一次
,该如何读取呢

多谢各位

编辑:
我强调我知道什么是
*
贪婪的
懒惰的

*
零次或多次的
零次或一次的
,但是
*?
零次或多次的,而不是贪婪的
。它是它自己的实体。

考虑字符串
aaabaaaaab
/.*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";
*
表示“匹配此
*
之前的表达式的任何次数(包括零次)”

表示“匹配此
时间之前的表达式”

贪婪vs.懒惰意味着表达式倾向于通过匹配尽快停止,而不是尽可能获得最长的匹配

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

请阅读以下内容-

在你的例子中,当?是在*之后使用的,它使*变懒,因此如果使用上面链接中的示例:

这个贪婪的正则表达式-

考虑到这个字符串
“这是第一次
测试”
相配
first

(它是贪婪的——它用了最大的(最宽的)匹配)

这个懒惰的正则表达式- 考虑到这个字符串 “这是第一次
测试”
相配


(它是懒惰的-它使用了最小的(最窄的)匹配)

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

Greedyness永远不会更改匹配的字符串和不匹配的字符串,但它可能会更改找到的匹配项。例如,
(AB*)B+/code>的第1组匹配
ABBBB
中的
A
,但
(AB*)B+/code>的第1组匹配同一字符串中的
abbb

“奇怪的地方”中的问号也用于在几个regexp引擎中可用的其他特殊组合,例如:

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

正如你所看到的,它们都以
开头(?
这里的问号显然不能表示“零或一”(我们在一个表达式的开头,零或什么的?).

您使用的是哪个正则表达式引擎?这次是PHP。其他时候是JavaScript和ActionScript,有时也是其他。如何知道它们使用的是什么引擎以及它们如何影响我的正则表达式?我主要想知道您使用的语言。许多语言对正则表达式部分的解释不同,因此了解回答这个问题时的语言嗯…你真的测试过吗?谢谢你,维亚肯。如果不是6502的完整答案,你的答案应该是它。谢谢你,机器人(6502)。正是我想知道的,特别是这部分:
“零或多”之后的“零或一”没有任何意义…因此组合*?应被解读为单个标记,表示“零或更多-不贪婪”