正则表达式
…
开发工具与关键技术:RegexBuddy 4
作者:林敏静
撰写时间:2019年5月3日
…
正则表达式,又称为规则表达式,英文名为Regular Expression,在代码中常简写为regex、regexp或RE,常被用来检索、替换那些符合某个模式(规则)的文本,通俗地来说正则表达式是用于进行文本匹配的工具,本文主要讲正则表达式里的一些基础,还有比较常见的字符、方法。
我们来看一下它的页面(如下图),正则里基础语法规则大体一致,但每门语言具体来说又有点差别,这里我们使用的是C#,本文主要讲字符串的匹配还有替换。
先来看看看匹配是怎样的(如下图),比如说输入一个字母A,那么它就会在下面的字符串中把字母A匹配出来(有颜色标识的)。
如果说我们想要找到的只是单个字母A,而不是带字母A的单词,那该如何操作呢?这时我们就要用到正则表达式规定的一个特殊代码\b,我们也把它叫做元字符,匹配单词的开始或结束位置,而且\b是只匹配一个位置的,那么我们使用它就可以准确地匹配出字母A(如下图),
除了\b这个元字符外,还有其它的元字符,下面我们来看一下,
如 .这个是英文状态下的句号,比较小(一开始学习的时候我都没看到有这个点还以为是空格),千万不要忽略它哦!.它是匹配除换行符以外的任意字符的(如下图):
\w,它是匹配数字或字母或下划线或汉字(如下图):
\s,它是匹配任意的空白符,比如空格或换行符(如下图):
还有其它的元字符请看下边的表格,就不一一图片举例了(如下表格)。
元字符
.
匹配除换行符以外的任意字符
\w
匹配数字或字母或下划线或汉字
\s
匹配任意的空白符
\d
匹配数字等价于[0-9] [匹配指定范围]
\b
匹配单词的开始或结束
^
匹配字符串的开始
$
匹配字符串的结束
除了元字符还有反义字符和限定符,反义字符呢它的字符含义与元字符的恰好相反,那什么时候能用到反义字符呢,在你有时需要查找不属于某个能简单定义的字符,就比如想查找除了数字以外的任意字符,这时需要用到反义字符了(如下表格),
反义字符
\W
匹配任意不是字母,数字,下划线,汉字的字符
\S
匹配任意不是空白符的字符
\D
匹配任意非数字的字符
\B
匹配不是单词开头或结束的位置
[^x]
匹配除了x以外的任意字符
限定符呢就是限定匹配内容出现的次数,就是重复出现多少次(如下表格)。
常用限定符
重复零次或更多次
重复一次或更多次
?
重复零次或一次
{n}
重复n次
{n,}
重复n次或更多次
{n,m}
重复n到m次
比如说现在匹配一个11位数电话号码(如下图),以13开头匹配13后面的9位数字,也就是匹配13后面出现的9个数字,{n}表示的是匹配的次数,{9}就是匹配9次,加上前面匹配13加匹配数字9次就成功匹配出了这个电话号码。
那么讲完限定符之后接下来讲的是正则表达式里面的替换。正则表达式里的替换指的是有几种规则,如果满足其中任意一种规则都应该当成匹配,具体方法是用|把不同的规则分隔开.
替换可以使用多种匹配规则,接下来使用这个方法匹配三种不同格式的电话号码(如下图)
以上是使用了三个不同的规则匹配三个不同格式的电话号码,说明了替换可以使用多个规则来匹配。
特别强调,在使用替换时顺序是很重要的,因为在匹配替换时,是从左到右地测试每个分枝的条件,如果满足了某个分枝的条件,就不会去管其它的替换条件了。
接下来要讲的是分组语法里面的零断宽言(如下表格)。
零断宽言
(?=exp)
匹配exp前面的位置
(?<=exp)
匹配exp后面的位置
(?!exp)
匹配后面跟的不是exp的位置
(?<!exp)
匹配前面不是exp的位置
这里我们挑其中两个方法来讲一个例子,
例子:<img οnlοad=“AutoResizeImage(200,200,this)“src=”/Document/Title/Temp/2017-12-114bc5.png”
(?=exp)
是匹配exp前面的位置,也叫零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp,也就是匹配exp前面的数据,这里使用(?=exp)来匹配的是例子中的src前面的数据,(如下图)。
这样我们就匹配到了src前面的内容,既然能匹配前面的同样后面的也能匹配,(?<=exp)就是匹配exp后面的位置,(?<=exp)也叫零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式exp,接着使用这个来匹配src后面的数据(如下图)
还有贪婪匹配与懒惰匹配,听到这个名称是不是很新奇(反正我刚学习的时候就觉得)。什么是贪婪匹配呢?就是当正则表达式中包含能接受重复的限定符时,就是在使整个表达式能得到匹配的前提下,匹配尽可能多的字符,这被称为贪婪匹配。懒惰匹配呢就和贪婪匹配相反,它是匹配尽可能少的字符,懒惰限定符就是在限定符的后面加上个问号?(如下表格)
懒惰限定符
*?
重复零次或更多次,但尽可能少重复
+?
重复一次或更多次,但尽可能少重复
??
重复零次或一次,但尽可能少重复
{n}?
重复n次,但尽可能少重复
{n,}?
重复n次或更多次,但尽可能少重复
{n,m}?
重复n到m次,但尽可能少重复
相对于贪婪匹配,懒惰匹配使用得多一点,下面就举一个懒惰匹配的例子(如下图),用懒惰限定符在字符串里获取具体日期数据
关于正则表达式的基础学习就暂时分享到这里,这些都是比较基础,常用的一些正则,希望能对你有所帮助。
注:正则表达式及字符详解源于课堂讲义,本文仅为总结学习分享