我遇到了一个我不完全理解的正则表达式-有人能帮我破译它吗:
^home(?:\/|\/index\.asp)?(?:\?.+)?$
它用于url匹配,上面的示例匹配以下url:
home home/ home/?a home/?a=1 home/index.asp home/index.asp?a home/index.asp?a=1
在我看来,括号中的问号(?:没有任何作用,有人能给我点化吗?使用的regex版本是ClassicASP提供的版本,如果有帮助的话,它会在服务器上运行。
(?:
9rbhqvlz1#
(?:)创建一个 * 非捕获组 *。它将内容分组在一起,而不创建反向引用。反向引用是可以在表达式中引用的部分或可能的替换(通过\1或$1等-取决于口味)。当在编程语言中使用regex时,你也可以在之后从匹配中提取它们。使用(?:)的主要原因是避免创建新的反向引用,这样可以避免增加组号,如果您重复一个组并且不希望出现不可预测的组号,则增加组号尤为重要,并且可以节省(通常可以忽略的)内存
(?:)
\1
$1
ax6ht2ek2#
这是一个非捕获组,本质上与使用(...)相同,但内容不会保留(不能用作反向引用)。如果你正在做这样的事情:(abc)(?:123)(def)您将在$1中获得abc,并在$2中获得def,但仅匹配123。
(...)
(abc)(?:123)(def)
abc
$2
def
123
nhhxz33t3#
来自文件:
(?:...) 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.
0yg35tkg4#
它真的很容易每一个圆括号将创建一个变量在内存中,所以你可以使用圆括号的值后,所以不保存它在内存中只是把:?在圆括号中像这样(?:),然后填写其余的你需要的。这就是它,没有别的
4条答案
按热度按时间9rbhqvlz1#
(?:)
创建一个 * 非捕获组 *。它将内容分组在一起,而不创建反向引用。反向引用是可以在表达式中引用的部分或可能的替换(通过
\1
或$1
等-取决于口味)。当在编程语言中使用regex时,你也可以在之后从匹配中提取它们。使用(?:)
的主要原因是避免创建新的反向引用,这样可以避免增加组号,如果您重复一个组并且不希望出现不可预测的组号,则增加组号尤为重要,并且可以节省(通常可以忽略的)内存ax6ht2ek2#
这是一个非捕获组,本质上与使用
(...)
相同,但内容不会保留(不能用作反向引用)。如果你正在做这样的事情:
(abc)(?:123)(def)
您将在$1
中获得abc
,并在$2
中获得def
,但仅匹配123
。nhhxz33t3#
来自文件:
0yg35tkg4#
它真的很容易每一个圆括号将创建一个变量在内存中,所以你可以使用圆括号的值后,所以不保存它在内存中只是把:?在圆括号中像这样(?:),然后填写其余的你需要的。这就是它,没有别的