31

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

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

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

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

在我看来,括号内的问号(?:没有任何作用。有人可以启发我。

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

4

4 回答 4

39

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

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

于 2013-01-03T11:37:05.890 回答
13

它是一个非捕获组,本质上与 using 相同(...),但不保留内容(不能作为反向引用)。

如果你正在做这样的事情:(abc)(?:123)(def)你会进入abc$1进入def$2123只会被匹配。

于 2013-01-03T11:38:44.057 回答
1

它真的很容易每个括号都会在内存中创建一个变量,因此您可以在之后使用括号值以便不将其保存在内存中,只需放入:?在像这样 (?:) 的括号中,然后根据需要填写其余部分。仅此而已

于 2018-11-30T07:34:25.117 回答
1

从文档:

(?:...)
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.
于 2019-10-18T05:57:09.557 回答