?:正则表达式中的表示法

时间:2016-04-10 00:53:06

标签: regex

对于我的一个类,我必须描述以下正则表达式:

\b4[0-9]{12}(?:[0-9]{3})\b

据我所知,它选择一个数字:从4开始,后跟12位数字(每个在0-9之间),然后是另外3位数字。

我不明白的是带分号的问号(?:....)。我试过在线查找这意味着什么,但我发现的链接有些令人困惑;我希望有人可以快速了解问号在这个例子中的作用。

2 个答案:

答案 0 :(得分:61)

这将是简短回答。

当您使用(?:)时,表示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

如果您更改为var {Cu} = require("chrome"); const { CustomizableUI } = Cu.import('resource:///modules/CustomizableUI.jsm', {}); ,则不再捕获,因此无法返回参考。

Regex101 demo for non-capturing group

A live answer.

答案 1 :(得分:10)

它被称为非捕获组',这意味着正则表达式不会通过匹配内部的匹配组成一个组,就像它会这样做(通常,括号会创建一个组。)