正则表达式中的 ?: 是什么意思?

58

我有一个正则表达式看起来像这样

/^(?:\w+\s)*(\w+)$*/

什么是?:操作符?


20
它的存在是为了让人困惑。 - JAL
3
可能是非捕获组?(?:)的重复问题。 - HamZa
4个回答

59

这表示子模式是非捕获子模式。这意味着无论在(?:\w+\s)中匹配到什么,即使它被括在()中,它也不会出现在匹配列表中,只有(\w+)会出现。

你仍然在寻找一个特定的模式(在这种情况下,至少跟随一个单词的单个空格字符),但你并不关心实际匹配到的内容。


15

这意味着只进行分组但不记住已分组的部分。

默认情况下,() 向正则表达式引擎表示要记住与其匹配的字符串部分。但是有时我们只想对一个模式进行分组而不触发正则表达式引擎的记忆功能,为此我们使用 (?: 替换 (


6
对我来说仍然很困惑...你能提供一些简单的例子吗? - Beeing Jk
请查看以下问题的答案: 非捕获组 - Humza Naveed

9

除了提供的优秀答案外,它的用处还在于简化从匹配结果中提取组所需的代码。例如,您的(\w+)组被称为第1组,无需关心出现在它之前的任何组。这可能会提高您代码的可维护性。


1
让我们通过一个例子来理解吧。
简单地说,我们可以这样说,例如我被给予一个字符串,比如(s="a eeee").
你的正则表达式(/^(?:\w+\s)(\w+)$<\/em>/)在本例中的基本作用是从字符串开始查找'a',并注意到这里有一个空格字符。如果您没有包括(?:),它将返回'a '(带有空格字符的a)。
如果您不希望得到这种类型的答案,因此您已经包含了*(?:\w+\s)*,它将仅返回一个不带空格的简单'a'。也就是说,(?:匹配字符串,但不包括其后面的任何内容。这意味着它将匹配字符串,但不匹配空格(考虑匹配数字或字符串而非其他附加内容)。
注:我是正则表达式的初学者。这是我对(?:的理解。请随时指出我解释错误的地方。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接