C#正则表达式基础语法
正则表达式是个非常好的工具,它的作用主要是用简单的有规则的表达式来检索和匹配一段字符串。
所以正则表达式的作用大致有两种:
1、匹配
2、检索
为了更好的测试正则表达式的规律我们可以采用正则表达式工具。RegEx Buddy。
一、正则表达式基础知识
1、元字符的概念和元字符的反义
(1) 点(.)
表示匹配除了换行符意外的任意单个字符。
(2)\w
表示匹配数字,字母,下划线,汉字等单个字符
如上,空格和标点符号和斜杠都没有匹配上。其余都匹配上了
(3)\s
匹配任意空白单个符
如上,所有空格被匹配上了。其余没有
(4)\d
匹配单个数字
(5)\b
匹配单词的开始或结束
\bgood
good\b
\bgood\b
(6)\W
与\w是反义,即\W匹配的是任意不是字母,数字,下划线或汉字的单个字符
(7)\S
与\s是反义,即\S匹配任意不是空白的单个字符,换行符也算是空白
(8)\D
与\d是反义,即\D匹配的是任意不是数字的单个字符
(9)\B
与\b是反义,即\B匹配的是任意不是单词开头或结束的字符
\Bgood
上述结果刚好和\b相反
(10)[^x]
匹配除了x意外的任意单个字符
[^2]
上述结果除了2外其他全部匹配上了。
(11)[^good]
匹配除了good字母外外的任意单个字符
(12)^和$
表示字符串的开头或者字符串的结尾。
例如:
^a?ld&
表示的是匹配一个字符串其开头有或者没有a字符,但后面肯定紧跟着ld并结束的字符串。
所以ald、old、cld、eld、都可匹配
adalde不可匹配,因为ald在中间,前面不是开始,后面也不是结束
2、转义匹配
以‘.’符号为例,上述我们提及到了‘.’匹配的是任意不为空的字符。但是如果我们就是想要匹配‘.’怎么办?
解决办法就是加上.即可。
3、实例
1、
I am a Apple,the old is 16.
ald
bld
cld
eld
fld
gld
ld
问:找出上述字符串中的所有包含ld的单词
答:^.?ld$
解析:
‘.’表示匹配所有不为空的单个字符
‘?’与‘.’搭配表示有或者没有即0或1都可的意思
ld表示匹配中含有这两个字母
^和$表示匹配的开始和结束
注意:第一句中的old不会匹配,因为它并不是开始位置,不符合^的约束
二、正则表达式中几种重复模式
1、*
指的是重复零次或更多次
2、+
指的是重复一次货更多次
3、?
指的是重复一次或零次
4、{n}
指的是重复n次
5、{n,}
指的是重复n次或更多次
6、{n,m}
指的是重复n到m次,例如{2,4}即2个到4个均可以。
三、正则表达式中分支条件
如果匹配模式包含多种,只要满足其中一种即可的话。就将多种表达式中间用|符号隔开,即使或的意思。
如下:
0\d{2}-\d{8}|0\d{3}-\d{8}
以上两种表达式只要满足其中一种即可。值得注意的是,会存在短路现象。
四、正则表达式字符类
首先提个概念:
[]的作用是表示一个范围。
例如:
[aeiou]表示aeiou都可以
[0-4]表示01234这几个字符
常用字符类说明:
1、[0-9]\d 表示单个数字字符
2、[a-z0-9A-Z]\w 表示数字,字母汉字等
3、[aeiou] 表示aeiou都可以
又如下:
(?0\d{2}[)-]?\d{8}
其中(代表‘(’这个字符,前面的\是转义的意思
固上面的正则表达式的意思为:
匹配一个字符串,其中开头可能有(也可能没有,接着后面固定为0开头的共三位数字,接着有或者没有)或者-,最后又8个数字。
它的目的就是匹配前三个数字带括号或者中间带-的号码。
五、正则表达式的分组概念&贪婪与懒惰概念
1、分组
(1)将子表达式做成子集
(2)使用()进行分组
(3)方便对match的字符串进行划分
(4)分组的命名:(?exp)
(5)(?:exp)
(6)(\d{1,3}.){3}\d{1,3} IP地址的匹配
2、贪婪和懒惰
(1)*? 重复任意次,但是尽可能少
(2)+?重复1次或更多次,但尽可能少
(3)??重复0次货
(1)贪婪 (尽可能的多)
a.*b表示匹配第一个字符为a,最后一个为b中间有0个或很多个任意非空字符。
所以aabab的结果为aabab
(2)懒惰 (尽可能的少)
a.*?b表示匹配第一个字符为a,最后一个字符为b,中间可能有多个任意非空字符可能没有。其中?是与*匹配的,这样的结果就是要么只有一个任意非空字符,要么有多个非空字符。
所以aabab的结果为aab,因为aab满足中间有一个字符。按照就
六、处理选项
1、IgnoreCase
匹配时不区分大小写
2、Multiline
更改^和$的含义,使他们分别在任意一行的行首和行尾匹配,而不仅仅在整个字符串的开头和结尾匹配。
通常来说^和$有两个可选择的含义,一个是一个连串的单词的首和尾,
一个是一整行的首和尾,通过Multiline可以改变他们的含义,使之面向的是一整行的首和尾。
3、Singleline
更改.的含义,使它与每一个字符匹配(包括换行符\n)
4、IgnorePatternWhitespace
忽略表达式中的非转义空白并启用由#标记的注释
5、ExplicitCapture
仅补货已被显示命名的组
七、负向0宽断言
例如:查找这样一个单词–它里面出现了字母q但是后面不能跟u
表达式1:
\b\w*[^u]\w*\b