龙空技术网

正则表达式教程 #5 `()` 闭合括弧各种语义用途

狮子哥哥520 2148

前言:

此刻我们对“数组的下标是用什么括起来的”大约比较关切,姐妹们都想要分析一些“数组的下标是用什么括起来的”的相关资讯。那么小编在网络上搜集了一些对于“数组的下标是用什么括起来的””的相关文章,希望我们能喜欢,你们快快来学习一下吧!

上一章回顾

上一章 我们学习以下术语:环视(Lookaround),继续学习括弧()的各种用途

操作符

说明

(?=Expression)

顺序肯定环视(正向前瞻),表示所在位置右侧能够匹配Expression

(?!pression)

顺序否定环视,表示所在位置右侧不能匹配Expression

(?<=pression)

逆序肯定环视(正向后顾),表示所在位置左侧能够匹配Expression

(?<!pression)

逆序否定环视,表示所在位置左侧不能匹配Expression

捕获分组 capture group:(expression)

在我们拆分理解正则表达式的时候,经常遇到带闭合括弧的正则表达式:(expression),他有几个作用:

我们知道可对单个字符加量词可以对字符进行重复次数的匹配,如果要将多个元字组成一个完整语义,当前成一个整体使用,进行组级别的重复,可以用闭合的()包含起,当然只要你原因,你可以把每个元字符都用闭合的括弧包含起来。通过分组编号,引用分组中的表达式进行查找和替换其中group(0)作为整个一次匹配表达式,其他分组依次以左括弧顺序位置命名,以\n或者$n来表示对应的分组

//Java:final String regex = "(A(B(C))D(E))F";final String input = "ABCDEF你咬我ABCDEF";//group(1):ABCDE,group(2):BC,group(3):C,group(4):E,//$0 -> ABCDEF//$1 -> ABCDE//$2 -> BC//$3 -> C//$4 -> E

匹配过程:捕获分组

非捕获分组- Non-capturing group (?:expression)

在正则表达式语法中,无论是否需要引用分组,只要出现了括号,正则引擎就会把括号内的子表达式存储起来,提供引用。如果并不需要引用,保存这些信息无疑会影响正则表达式的性能;如果表达式比较复杂,要处理的文本有很多,更可能严重影响性能。这里就引申出我们的另一个术语:非捕获分组(?:expression),只能限定量词的作用范围,不捕获任何文本,分组的编号同样会按开括号出现的顺序从左到右递增,只是必须以捕获分组为准,非捕获分组会略过

//Java:final String regex = "(?A(B(C))D(E))F";final String input = "ABCDEF你咬我ABCDEF";//group(1):ABCDE,group(2):BC,group(3):C,group(4):E,//$0 -> ABCDEF//$1 -> BC//$2 -> C//$3 -> E

匹配结果:

略过非捕获分组

命名分组:·(?<groupName>expression)

对捕获分组我们用数组下标来访问正则匹配到的分组,但正则表达式语法比较复杂,括弧嵌套比较多的时候,数组下标标识起来就会非常麻烦,所以引入命名分组这个概念,目前主流语义都支持。

//Java:final String regex1 = "(?<year>\\d{4})-(?<md>(?<month>\\d{2})-(?<day>\\d{2}))";final String input = "2021-06-08";Matcher matcher = grammarPattern.matcher(input);//matcher.group("year") -> 2021//matcher.group("md") -> 06-08//matcher.group("month") -> 06//matcher.group("day") -> 08

匹配结果:

按自定义分组名称提取分组匹配结果

当然你也可以用下标去获取捕获分组:

//matcher.group(1) -> 2021//matcher.group(2) -> 06-08//matcher.group(3) -> 06//matcher.group(4) -> 08
环视 Lookaround

在第四章我们学习了四种类似条件预查询的语义:(?=expression),也是一种用括弧组织多个元字符的特殊的表达式。

其他语言支持:

我们以Javascript语法实现为本文结束:

//Java:const RE_DATE = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/;const matchObj = RE_DATE.exec('2021-03-04');const year = matchObj.groups.year; // 2021const month = matchObj.groups.month; // 06const day = matchObj.groups.day; // 08console.log(year); // 2021console.log(day); // 31

C#支持:

//C#string pattern = @"(?<year>\d{4})-(?<md>(?<month>\d{2})-(?<day>\d{2}))";string input = "2021-06-08";Regex reg = new Regex(pattern, RegexOptions.IgnoreCase);Match mc = reg.Match(input);GroupCollection groups = mc.Groups;string convertid = "";foreach (string groupName in reg.GetGroupNames()){   Console.WriteLine(groups[groupName].Value);}

标签: #数组的下标是用什么括起来的