This question already has answers here:
What is a non-capturing group in regular expressions?

(15个答案)


4年前关闭。




对于我的类(class)之一,我必须描述以下正则表达式:
\b4[0-9]{12}(?:[0-9]{3})\b

我知道它选择的数字是:以4开头,后跟12位数字(每个数字在0-9之间),再跟着另外3位数字。

我不明白的是分号(?:....)的问号。我试图在网上寻找答案,但是我发现的链接有些困惑。我希望有人可以让我快速了解一下此示例中问号的作用。

最佳答案

这将是简短答案。

当您使用(?:)时,这意味着group已匹配但未被捕获以进行反向引用,即非捕获组。它没有存储在内存中以供以后引用。

例如:
(34)5\1
这个正则表达式意味着您要查找34,然后是5,然后是34。绝对可以将其编写为34534,但有时captured group是一个复杂的模式,您无法事先预测。

因此,无论是否与捕获组匹配的,都应该再次出现。

Regex101 demo for back-referencing

替换时也使用反向引用。

例如:
([A-Z]+)[0-9]+
此正则表达式将查找many大写字母,后跟many数字。我希望仅用找到的大写字母替换整个模式。

然后,我将使用\1替换
整个模式,(?:[A-Z]+)[0-9]+表示向后引用第一个捕获组。

Regex101 demo for replacement

如果更改为ojit_code,则它将不再捕获,因此无法被引用。

Regex101 demo for non-capturing group

A live answer.

10-05 21:06
查看更多