regex 什么(?:在正则表达式中执行

c2e8gylq  于 2023-03-04  发布在  其他
关注(0)|答案(4)|浏览(135)

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

^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提供的版本,如果有帮助的话,它会在服务器上运行。

9rbhqvlz

9rbhqvlz1#

(?:)创建一个 * 非捕获组 *。它将内容分组在一起,而不创建反向引用。
反向引用是可以在表达式中引用的部分或可能的替换(通过\1$1等-取决于口味)。当在编程语言中使用regex时,你也可以在之后从匹配中提取它们。使用(?:)的主要原因是避免创建新的反向引用,这样可以避免增加组号,如果您重复一个组并且不希望出现不可预测的组号,则增加组号尤为重要,并且可以节省(通常可以忽略的)内存

ax6ht2ek

ax6ht2ek2#

这是一个非捕获组,本质上与使用(...)相同,但内容不会保留(不能用作反向引用)。
如果你正在做这样的事情:(abc)(?:123)(def)您将在$1中获得abc,并在$2中获得def,但仅匹配123

nhhxz33t

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.
0yg35tkg

0yg35tkg4#

它真的很容易每一个圆括号将创建一个变量在内存中,所以你可以使用圆括号的值后,所以不保存它在内存中只是把:?在圆括号中像这样(?:),然后填写其余的你需要的。这就是它,没有别的

相关问题