This question already has answers here:
What is a non-capturing group in regular expressions?
(15个答案)
4年前关闭。
对于我的类(class)之一,我必须描述以下正则表达式:
我知道它选择的数字是:以4开头,后跟12位数字(每个数字在0-9之间),再跟着另外3位数字。
我不明白的是分号(?:....)的问号。我试图在网上寻找答案,但是我发现的链接有些困惑。我希望有人可以让我快速了解一下此示例中问号的作用。
(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.