浅谈C#中正则表达式的使用

2019-12-30 15:07:01于丽

 后向引用

在我们了解分组以后,我们就可以使用后向引用了。所谓后向引用,就是使用前面捕获的结果,对后面的字符进行匹配。多用于匹配重复字符。比如匹配 go go 这样的重复字符。我们就可以使用 (go) 1来进行匹配。

默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。当然,你也可以自己指定子表达式的组名。要指定一个子表达式的组名,请使用这样的语法:(?<Word>w+)(或者把尖括号换成'也行:(?'Word'w+)),这样就把w+的组名指定为Word了。要反向引用这个分组捕获的内容,你可以使用k<Word>,所以上一个例子也可以写成这样:b(?<Word>w+)bs+k<Word>b。

自定义组名还有另外一个好处,在我们的C#程序中,如果需要得到分组的值,我们就可以很明确的使用我们定义的分组的名字来得到,而不必使用下标。

当我们并不想使用后向引用时,是不需要捕获组记忆任何东西的,这种情况下就可以利用(?:nocapture)语法来主动地告诉正则表达式引擎,不要把圆括号的内容当作捕获组,以便提高效率。

 零宽断言

在前面的元字符介绍中,我们已经知道了有这样一类字符,可以匹配一句话的开始、结束(^ $)或者匹配一个单词的开始、结束(b)。这些元字符只匹配一个位置,指定这个位置满足一定的条件,而不是匹配某些字符,因此,它们被成为 零宽断言。所谓零宽,指的是它们不与任何字符相匹配,而匹配一个位置;所谓断言,指的是一个判断。正则表达式中只有当断言为真时才会继续进行匹配。

在有些时候,我们精确的匹配一个位置,而不仅仅是句子或者单词,这就需要我们自己写出断言来进行匹配。下面是断言的语法:

 

断言语法

说明

(?=pattern)

前向肯定断言,匹配pattern前面的位置

(?!pattern)

前向否定断言,匹配后面不是pattern的位置

(?<=pattern)

后向肯定断言,匹配pattern后面的位置

(?<!pattern)

后向否定断言,匹配前面不是pattern的位置