我遇到了一个我不完全理解的正则表达式 - 有人可以帮我解释它:
^home(?:\/|\/index\.asp)?(?:\?.+)?$
它用于网址匹配,上面的示例匹配以下网址:
home
home/
home/?a
home/?a=1
home/index.asp
home/index.asp?a
home/index.asp?a=1
在我看来,方括号(?:
内的问号没有做任何事情。有人可以启发我。
正在使用的正则表达式版本是经典ASP提供的版本,如果有帮助的话,它正在服务器上运行。
答案 0 :(得分:19)
(?:)
创建非捕获组。它将事物分组在一起而不会产生反向引用。
反向引用是您可以在表达式中引用的部分或可能的替换(通常通过说\1
或$1
等 - 取决于风格)。在编程语言中使用正则表达式时,通常也可以从匹配中提取它们。使用(?:)
的唯一原因是避免创建新的反向引用,这样可以避免增加组号,并保存(通常可以忽略不计的数量)内存
答案 1 :(得分:5)
这是一个非捕获组,与使用(...)
基本相同,但内容不会保留(不作为后引用)。
如果您正在执行以下操作:(abc)(?:123)(def)
您将abc
中的$1
和def
中的$2
,123
}只会匹配。
答案 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.