如何在正则表达式中使用非捕获组,即(?:),它们有什么好处?
当前回答
历史动机:
非捕获组的存在可以用括号来解释。
考虑表达式(a|b)c和a|bc,由于串联优先于|,这些表达式分别表示两种不同的语言({ac,bc}和{a,bc})。
然而,括号也用作匹配组(如其他答案所解释的…)。
当您想有括号但不想捕获子表达式时,可以使用NON-CAPTURING GROUPS。在示例中,(?:a|b)c
其他回答
让我举个例子:
Regex代码:(?:animal)(?:=)(\w+)(,)\1\2
搜索字符串:
第1行-动物=猫、狗、猫、老虎、狗
第2行-动物=猫、猫、狗、狗、老虎
第3行-动物=狗、狗、猫、猫、老虎
(?:动物)-->未捕获组1
(?:=)-->未捕获组2
(\w+)-->捕获的组1
(,)-->捕获的组2
\1-->捕获组1的结果,即第1行是猫,第2行是猫、第3行是狗。
\2-->捕获组2的结果,即逗号(,)
因此,在这段代码中,通过给出“1”和“2”,我们在代码后面分别回忆或重复捕获的组1和组2的结果。
根据代码的顺序,(?:动物)应为第1组,(?=)应为2组,并继续。。
但通过给出?:我们使匹配组不被捕获(在匹配组中不计数,因此分组编号从第一个捕获的组开始,而不是未捕获的组),这样以后就不能在代码中调用匹配组(?:动物)结果的重复。
希望这能解释非捕获组的使用。
我是一名JavaScript开发人员,将尝试解释其与JavaScript相关的意义。
考虑一个场景,你想将猫与动物相匹配当你想要匹配猫和动物时,两者之间应该有一个平衡点。
// this will ignore "is" as that's is what we want
"cat is animal".match(/(cat)(?: is )(animal)/) ;
result ["cat is animal", "cat", "animal"]
// using lookahead pattern it will match only "cat" we can
// use lookahead but the problem is we can not give anything
// at the back of lookahead pattern
"cat is animal".match(/cat(?= is animal)/) ;
result ["cat"]
//so I gave another grouping parenthesis for animal
// in lookahead pattern to match animal as well
"cat is animal".match(/(cat)(?= is (animal))/) ;
result ["cat", "cat", "animal"]
// we got extra cat in above example so removing another grouping
"cat is animal".match(/cat(?= is (animal))/) ;
result ["cat", "animal"]
?: 当您想对表达式进行分组,但不想将其保存为字符串的匹配/捕获部分时,使用。
一个例子是匹配IP地址:
/(?:\d{1,3}\.){3}\d{1,3}/
请注意,我不在乎保存前3个八位字节,但(?:…)分组允许我缩短正则表达式,而不会导致捕获和存储匹配项的开销。
简单的答案
使用它们来确保在这里出现几种可能性中的一种(?:一个|两个)或可选短语camp(?:站点)?或者一般来说,任何你想建立一个组/短语/部分而不需要特别提及的地方。
他们将您捕获的组数保持在最小值。
tl;dr非捕获组,顾名思义,是正则表达式中不希望包含在匹配中的部分,以及?:是一种将组定义为非捕获的方法。
假设你有一个电子邮件地址example@example.com.以下正则表达式将创建两个组,id部分和@example.com部分。(\p{Alpha}*[a-z])(@example.com)。为了简单起见,我们提取了包括@字符在内的整个域名。
现在让我们假设,您只需要地址的id部分。您要做的是获取匹配结果的第一个组,在正则表达式中用()包围,这样做的方法是使用非捕获组语法,即?:。因此,正则表达式(\p{Alpha}*[a-z])(?:@example.com)将只返回电子邮件的id部分。
推荐文章
- 如何从JavaScript中使用正则表达式的字符串中剥离所有标点符号?
- 正则表达式中的单词边界是什么?
- 如何将一个标题转换为jQuery的URL段塞?
- Javascript和regex:分割字符串并保留分隔符
- (grep)正则表达式匹配非ascii字符?
- 如何在保持原始字符串的同时对字符串执行Perl替换?
- 创建正则表达式匹配数组
- *的区别是什么?和。*正则表达式?
- 如何将“camelCase”转换为“Camel Case”?
- 在Java中使用正则表达式提取值
- Java中的正则表达式命名组
- 使用正则表达式搜索和替换Visual Studio代码
- 使用split("|")按管道符号拆分Java字符串
- 替换字符串中第一次出现的模式
- “\d”在正则表达式中是数字吗?