分享GPT的一些解释: 非捕获分组

经验创意 · 499 次浏览
CL 创建于 2023-05-26 09:52

阅读本教程的时候,有一些不是很理解的地方请教了一下GPT,这里也分享一下,供大家参考:

 

正则中的非捕获分组是什么额意思?
 
 
ChatGPT

在正则表达式中,非捕获分组(?:...)是一种特殊的分组,它匹配括号中的内容,但不会捕获该内容或分配该内容到组中。

在正则表达式中,通常使用圆括号 ( ) 来创建一个分组,这样可以在正则表达式的其他部分引用这个分组,或者在后续的代码中获取到匹配这个分组的文本。这被称为“捕获分组”。

然而,有时候你可能只是想用括号来改变操作符的优先级或者应用量词,而并不关心匹配到的内容。在这种情况下,就可以使用非捕获分组。

例如,假设你有一个字符串,里面有多个单词,你想要匹配3个或更多的 "foo" 或 "bar"。你可以写一个正则表达式 (?:foo|bar){3,}。这里的 (?:foo|bar) 是一个非捕获分组,它匹配 "foo" 或 "bar",但并不捕获匹配的内容。然后 {3,} 表示这个分组要匹配3次或更多次。

这样,你就可以匹配到像 "foofoobar"、"barfoofoo"、"barfoobarbar" 这样的字符串,而并不需要在代码中处理匹配到的每一个 "foo" 或 "bar"。

还是不太明白 (?:foo|bar){3,} 和 (foo|bar){3,} 有什么区别呢?
 
 

假设你使用的正则表达式是 (foo|bar){3,} ,并且你在文本中寻找匹配项,那么每次匹配成功,正则表达式引擎会保存匹配到的 "foo" 或 "bar" ,然后你可以在后续的代码中访问这些捕获的内容。在某些语言中,例如 Python 和 JavaScript,捕获的内容会存储在一个特殊的数组或其他数据结构中。

然而,如果你使用的是 (?:foo|bar){3,} ,那么即使正则表达式引擎找到了匹配 "foo" 或 "bar" 的内容,它也不会保存这些内容。也就是说,你不能在后续的代码中访问这些捕获的内容,因为它们并没有被捕获。这是非捕获组的主要特点。

总的来说,非捕获组 (?:...) 和捕获组 ( ... ) 在匹配规则上是相同的,区别在于,非捕获组匹配到的内容不会被保存以供后续引用或使用,而捕获组匹配到的内容会被保存。

在很多情况下,非捕获组的效率会更高,因为保存捕获的内容需要消耗额外的内存和处理时间。所以如果你不需要访问匹配到的内容,使用非捕获组是一个好的做法。


回复内容
WindChant 2023-07-17 09:40
#1

正常使用正则()匹配到的内容可以用在后续使用,例如"2022年09月22日,在22日"可以用 "(\d+)日,在\1日" ,此处\1即前面(\d+)匹配到的22,如果单纯用"(\d+)日,在\d+日","2022年09月22日,在23日"这样的也会被匹配到

回复主贴