什么(?:在正则表达式中做

时间:2013-01-03 11:35:53

标签: regex asp-classic

我遇到了一个我不完全理解的正则表达式 - 有人可以帮我解释它:

^home(?:\/|\/index\.asp)?(?:\?.+)?$

它用于网址匹配,上面的示例匹配以下网址:

home
home/
home/?a
home/?a=1
home/index.asp
home/index.asp?a
home/index.asp?a=1

在我看来,方括号(?:内的问号没有做任何事情。有人可以启发我。

正在使用的正则表达式版本是经典ASP提供的版本,如果有帮助的话,它正在服务器上运行。

4 个答案:

答案 0 :(得分:19)

(?:)创建非捕获组。它将事物分组在一起而不会产生反向引用。

反向引用是您可以在表达式中引用的部分或可能的替换(通常通过说\1$1等 - 取决于风格)。在编程语言中使用正则表达式时,通常也可以从匹配中提取它们。使用(?:)的唯一原因是避免创建新的反向引用,这样可以避免增加组号,并保存(通常可以忽略不计的数量)内存

答案 1 :(得分:5)

这是一个非捕获组,与使用(...)基本相同,但内容不会保留(不作为后引用)。

如果您正在执行以下操作:(abc)(?:123)(def)您将abc中的$1def中的$2123 }只会匹配。

答案 2 :(得分:0)

这真的很容易 每个括号都会在内存中创建一个变量,因此您以后可以使用括号值,以免将其保存在内存中:放在这样的括号(?:)中,然后根据需要填充其余部分。 就是这样

答案 3 :(得分:0)

摘自文档:

(?:...)
A non-capturing version of regular parentheses. Matches whatever regular expression is inside the parentheses, but the substring matched by the group cannot be retrieved after performing a match or referenced later in the pattern.