加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式之分组捕获、条件表达式、平衡组

发布时间:2020-12-14 01:55:41 所属栏目:百科 来源:网络整理
导读:分组捕获- () 就是用括号把要匹配的内容扩起来 命名分组捕获- (?name)或(?'name') 就是在分组捕获的基础上,增加?分组名或?'分组名' 为了巩固印象,举个例子 axaxbxxxbxxx 分组捕获: (a)x 一次匹配结果,将会得到ax,其中分组1捕获结果为a 命名分组捕获:

分组捕获-()

就是用括号把要匹配的内容扩起来

命名分组捕获-(?<name>)或(?'name')

就是在分组捕获的基础上,增加?<分组名>或?'分组名'

为了巩固印象,举个例子

axaxbxxxbxxx

分组捕获:

(a)x

一次匹配结果,将会得到ax,其中分组1捕获结果为a

命名分组捕获:

同样的文本,使用(?<data>a)x

一次匹配结果,你可以用分组序号1,或是分组名data获得分组匹配结果a

条件表达式-(?<data>...)(?(data)yes|no)
非常高兴,我们开始切入正题了。条件表达式让我们的正则具有了一定的逻辑判断能力。比如:

文本:

文本[12]和【56】abcd

要求:

找到[]或【】中间的数字

我们自然要考虑[】或是【]这两种错误的配对关系,这正好使用条件表达式

(?<=(?<o1>/[)|(?<o2>/【))/d+(?=(?(o1)/]|/】))

别看晕了,容我慢慢给你讲明这个表达式的书写思路。

首先,我们要的是中间的数字,如果有其他的怎么办?当然是整个丢掉,我们不打算跑题的节外生枝把[文字]也捕获进来,或是具有容错的[12]捕获进来,我们在讨论问题,就题目而论就可以了。

我首先想到的应该使用(?<=exp)/d+(?=exp2)的写法,这样最终结果就只有数字了。

那么,exp如何写呢?

很简单,(?<=[/[/【]),这样的话,我们无法做到前后的括号类型配对,好吧,我们把[和【分别捕获,并记录对应的分组,这样方便后面可以引用。

前面部分就变成:

(?<=(?<o1>/[)|(?<o2>【))

就单这一部分,我们就捕获到了一个位置,前面是[或是【的位置,而如果前面是[,则分组o1捕获到,反之o2捕获到,到目前为止,都关系不大。但为了能得到对应的匹配,我们配合条件表达式,就方便很多了。

exp2

我们可以写为

(?=(?(o1)/]|/】))

什么意思呢?

(?(o1)/]|/】)

表示这里检查o1分组捕获情况,如果捕获成功,则执行/]的匹配,反之,执行/】的匹配。这样,我们用条件表达式,就可以确定[]和【】的对应关系了。

平衡组(?<group>)(?<-group>)(?(group)?!)

这个名词已经用了很久了,无从考证出处,《c#字符串和正则表达式》书中没有提到,无所谓出处了,但这个名字,倒是让一个简单的概念变得复杂了,可能我也愚笨,弄了好久才明白,其实很简单的东西。

说白了,就是命名分组的一个高级用法,命名分组,我们写(?<group>)可以把捕获到的内容压入堆栈,而另一个高级的用法,是(?<-group>)可以把已经压入堆栈的元素弹出堆栈,(?(group)?!)则是我们刚才看到的条件表达式,如果捕获到了group分组,则执行?!表达式,?!就是表达式为假,匹配失败。

举个不用标准写法的例子,可能更容易理解一点。

例如文本:

xxxxaxxaxxaxxbxxbxxbxxxx

我们可以用代码方式做a...b的验证

[c-sharp] viewplain copy

stringtest="xxxxaxxaxxaxxbxxbxxbxxxx";

Matchm=Regex.Match(test,"a((?<o>a)|(?<-o>b)|[^ab]+)+b");

if(m.Groups["o"].Captures.Count>0)

{

Console.WriteLine("错误,不是完整的a...b对应关系,有单独的a存在");

}

else

{

Console.WriteLine("很好,a...b对应。");

}

可以不使用条件表达式,在代码中判断也可以。

做这个例子的意义是什么呢?意思就是说明所谓的“平衡组”的工作原理,是检查是否还有没有弹出栈的分组,如果有,则表明不是配对存在的,反之是配对出现的。这就是常用的平衡组意义。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读