正则表达式
概念:正则表达式是用来进行文本处理的技术,是语言无关的,在几乎所有语言中都有实现
元字符:
1、.:匹配除\n之外的任何单个字符。例如正则表达式"b.g"能匹配如下字符串:"big"、"bug"、"b g",但是不匹配"buug","b..g"可以匹配"buug"。
2、[ ] :字符组,匹配括号中的任何一个字符(范围,字符集合)。例如正则表达式"b[aui]g"匹配bug、big和bag,但是不匹配beg、baug。可以在括号中使用连字符"-"来指定字符的区间来简化表示,例如正则表达式[0-9]可以匹配任何数字字符,这样正则表达式"a[0-9]c"等价于"a[0123456789]c"就可以匹配"a0c"、"a1c"、"a2c"等字符串;还可以制定多个区间,例如"[A-Za-z]"可以匹配任何大小写字母,"[A-Za-z0-9]"可以匹配任何的大小写字母或者数字。
3、| :将两个匹配条件进行逻辑"或"运算。'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。
4、( ) :将 () 之间括起来的表达式定义为"组"(group),并且将匹配这个表达式的字符保存到一个临时区域,这个元字符在字符串提取的时候非常有用。把一些字符表示为一个整体。改变优先级、定义提取组两个作用。
限定符:限定前面正则表达式出现的次数
1、*:匹配0至多个在它之前的子表达式。等价于{0,}。例如正则表达式"zo*"(等同于z(o)*)能匹配 "z" 、"zo"以及 "zoo";因此".*"意味着能够匹配任意字符串。"z(b|c)*"→zb、zbc、zcb、zccc、zbbbccc。"z(ab)*"能匹配z、zab、zabab(用括号改变优先级)。
2、+ :匹配前面的子表达式一次或多次,和*对比(0到多次)。等价于{1,}例如正则表达式9+匹配9、99、999等。 "zo+"能匹配 "zo"以及 "zoo" ,不能匹配"z"。
3、? :匹配前面的子表达式零次或一次。等价于:{0,1}例如,"do(es)?" 可以匹配 "do" 或 "does" 。【colou?r、favou?r】一般用来匹配"可选部分"。(终止贪婪模式)
4、{n} :匹配确定的 n 次。"zo{2}"→zoo。例如,"e{2}" 不能匹配"bed"中的"e",但是能匹配"seed"中的两个"e"。 //seeeed,不可以。
5、{n,} :至少匹配n次。例如,"e{2,}"不能匹配"bed"中的"e",但能匹配 "seeeeeeeed"中的所有"e"。
6、{n,m} :最少匹配 n 次且最多匹配 m 次。"e{1,3}"将匹配"seeeeeeeed"中的前三个"e"。 {2,5}//bed,seed,seeed;beeeeed错误。
7、^(shift+6) :匹配一行的开始。例如正则表达式"^regex"能够匹配字符串"regex我会用"的开始,但是不能匹配"我会用regex"。
8、(shift+4) :匹配行结束符。例如正则表达式"浮云" 能够匹配字符串"一切都是浮云"的末尾,但是不能匹配字符串"浮云呀"
正则简写表达式:
\d:代表一个数字,等同于[0-9] \\d →\d
\D:代表非数字,等同于[^0-9]
\s:代表换行符、Tab制表符等空白字符 ,(空格、回车、制表符)
\S:代表非空白字符(a0%$@@)
\w:匹配字母或数字或下划线或汉字,即能组成单词的字符。如果通过 ECMAScript 选项指定了符合 ECMAScript 的行为,则 \w 等效于 [a-zA-Z_0-9]。 ^()!@#%^&*()
\W:非\w ,等同于[^\w] %
\b:单词的边界(一边是单词(\w),一边不是单词。(\W))。Hello ni hao,are you kidding? D-Day
正则表达式(Regular Expression)的主要类:Regex
常用的3种情况:(C#语法)
判断是否匹配:Regex.IsMatch("字符串","正则表达式");
字符串提取:Regex.Match("字符串","要提取的字符串的正则表达式");//只能提取一个(提取一次)
字符串提取(循环提取所有): Regex.Matches(),(可以提取所有匹配的字符串。)
字符串替换:Regex.Replace("字符串","正则","替换内容");
Regex.Split();
贪婪模式&&非贪婪模式
贪婪模式演示:(当提取多个超链接的时候)
"1111。11。111。111111。"
贪婪:.+。(默认为贪婪模式,尽可能的多匹配。)
非贪婪:.+?。(尽可能的少匹配,(1个。))
从文本提取出名字:
Match match = Regex.Match("大家好。我是S.H.E。我22岁了。我病了,呜呜。fffff", "我是(.+)。");//没有加^$。
看结果。+、*的匹配默认是贪婪(greedy)的:尽可能多的匹配,直到"再贪婪一点儿"其后的匹配模式就没法匹配为止。
在+、*后添加?就变成非贪婪模式(? 的另外一个用途):让其后的匹配模式尽早的匹配。修改成"我是(.+?)。"
一般开发的时候不用刻意去修饰为非贪婪模式,只有遇到bug的时候发现是贪婪模式的问题再去解决。如果匹配的结果比自己预想的要多,那么一般都是贪婪模式的原因。
匹配组
正则表达式可以从一段文本中将所有符合匹配的内容都输出出来。Match获得的是匹配的第一个。Regex.Matches方法可以获得所有的匹配项。
字符串替换
Regex.Replace,将字符串中匹配的内容替换为指定的内容
将所有连续的a替换为一个A(原需求:把连续的空格替换为一个空格):
string s = Regex.Replace("你aaa好aa哈哈a你", "a+", "A");
删除所有连续的a,其实就是将连续的a替换为空字符串。