如何在正则表达式中使用非捕获组,即(?:),它们有什么好处?
当前回答
我不能评论最上面的答案来这样说:我想补充一个明确的观点,这只是在最上面的回答中暗示的:
非捕获组(?…)不会从原始完全匹配中删除任何字符,它只会对程序员进行可视化的正则表达式重组。
要访问正则表达式的特定部分而不定义外来字符,您将始终需要使用.group(<index>)
其他回答
您可以使用捕获组来组织和分析表达式。非捕获组具有第一个好处,但没有第二个好处的开销。例如,您仍然可以说非捕获组是可选的。
假设你想匹配数字文本,但有些数字可以写成1、2、3、4,。。。如果要捕获数字部分,而不是(可选)后缀,则可以使用非捕获组。
([0-9]+)(?:st|nd|rd|th)?
这将匹配形式1、2、3…或形式1、第2、第3…的数字,。。。但它将只捕获数字部分。
(?:…)充当一个组(…),但不捕获匹配的数据。它确实比标准的捕获组效率高得多。当你想对某个东西进行分组,但以后不需要重用它时,就可以使用它了@托托
我不能评论最上面的答案来这样说:我想补充一个明确的观点,这只是在最上面的回答中暗示的:
非捕获组(?…)不会从原始完全匹配中删除任何字符,它只会对程序员进行可视化的正则表达式重组。
要访问正则表达式的特定部分而不定义外来字符,您将始终需要使用.group(<index>)
在复杂的正则表达式中,可能会出现这样的情况:您希望使用大量的组,其中一些组用于重复匹配,另一些组用于提供反向引用。默认情况下,匹配每个组的文本将加载到backreference数组中。如果我们有很多组,并且只需要能够从backreference数组中引用其中的一些组,我们可以重写此默认行为,告诉正则表达式某些组只用于重复处理,不需要捕获并存储在backreference阵列中。
它使组不捕获,这意味着该组匹配的子字符串将不包含在捕获列表中。ruby中的一个示例说明了区别:
"abc".match(/(.)(.)./).captures #=> ["a","b"]
"abc".match(/(?:.)(.)./).captures #=> ["b"]
推荐文章
- 如何从JavaScript中使用正则表达式的字符串中剥离所有标点符号?
- 正则表达式中的单词边界是什么?
- 如何将一个标题转换为jQuery的URL段塞?
- Javascript和regex:分割字符串并保留分隔符
- (grep)正则表达式匹配非ascii字符?
- 如何在保持原始字符串的同时对字符串执行Perl替换?
- 创建正则表达式匹配数组
- *的区别是什么?和。*正则表达式?
- 如何将“camelCase”转换为“Camel Case”?
- 在Java中使用正则表达式提取值
- Java中的正则表达式命名组
- 使用正则表达式搜索和替换Visual Studio代码
- 使用split("|")按管道符号拆分Java字符串
- 替换字符串中第一次出现的模式
- “\d”在正则表达式中是数字吗?