对于我的一个类,我必须描述以下正则表达式:
\b4[0-9]{12}(?:[0-9]{3})\b
据我所知,它选择一个数字:从4开始,后跟12位数字(每个在0-9之间),然后是另外3位数字。
我不明白的是带分号的问号(?:....)。我试过在线查找这意味着什么,但我发现的链接有些令人困惑;我希望有人可以快速了解问号在这个例子中的作用。
答案 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]+
代表反向引用第一个捕获的组。
如果您更改为var {Cu} = require("chrome");
const { CustomizableUI } = Cu.import('resource:///modules/CustomizableUI.jsm', {});
,则不再捕获,因此无法返回参考。
答案 1 :(得分:10)
它被称为非捕获组',这意味着正则表达式不会通过匹配内部的匹配组成一个组,就像它会这样做(通常,括号会创建一个组。)