.NETCoreCSharp 中级篇2-4
本节内容为正则表达式的使用
简介有的时候,你是否有过这种需求:判断一个Ip地址、邮箱、密码规则是否合法。如果让你使用if一类的传统方法进行处理,你肯定会被逼疯的。而对于绝大多数的编程语言而言,都有一个字符串处理利器————正则表达式。它可以轻松的让字符串和规则匹配上。有点这样的意思,从前你是判断字符串,去遍历它,而有了正则表达式,你是在书写一个通用性质的规则,让字符串与规则进行匹配。正则表达式本质上就是一串蕴含了一些特殊字符规则的字符串,因此我们书写正则表达式其实是在书写一个字符串,只是它代表了一定的规则而已。
常见的几种正则符号事实上正则表达式没有过多的知识点,只是一些技巧性的训练,但请相信我,正则表达式是非常重要的。熟练的使用下列的正则符号会对你大有脾益。
元字符 元字符 说明. 匹配除了换行符以外的任意字符
\w 匹配字母、数字、下划线以及汉字
\s 匹配任意空白符
\d 匹配数字
\b 匹配单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束
1.例如匹配abc开头的字符串
\babc 或者 ^abc2.匹配5位数字的字符串
^\d\d\d\d\d$ 重复限定符号有了元字符就可以写不少的正则表达式了,但细心的你们可能会发现:别人写的正则简洁明了,如果你只使用元字符进行正则表达式的书写,既不美观也不实用,因此我们使用重复限定符进行重复数据的处理,下面我们来看一些限定符:
| 字符 | 说明 |
|:-----:|:------------------:|
| * | 重复0次或多次 |
| + | 重复一次或一次以上 |
| ? | 重复0次或一次 |
| {n} | 重复n次 |
| {n,} | 重复n次或更多次 |
| {n,m} | 重复n到m次 |
现在我们就能书写相当美观的正则表达式了,例如:
1.匹配7位数字的电话号码
2.匹配138开头的手机号
^138\d{8}3.匹配a开头,若干个b结尾的字符串
^ab*$ 分组现在我们已经学会以一点关于书写正则表达式的方法,不过,我们现在无论是匹配还是重复都是针对单个字符进行操作,假如说我希望匹配一个以ab为循环的重复字符串应该如何去处理呢?
答案很简单,就是分组,分组我们通常使用()进行分组,例如匹配以ab为循环的字符串为:
^(ab)* 转义字符有的时候,我们需要匹配的字符串中本身就含有正则表达式中的关键字符,我们则需要转义,例如我们需要匹配(ab)为循环的字符串:
^(\(ab\))*反斜杠\就是我们的转义字符。不过对于C#中,字符串含有反斜杠会自动转义,为了避免这种情况,我们需要在字符串之前加上@或者将将转义字符转义,也就是\两个斜杠
条件或有的时候,我们需要匹配的字符串可能是ab开头也有可能是cd开头,这个时候我们就使用条件语句处理,例如:
^(ab|cd)*用逻辑或“|”进行处理。
区间匹配有的时候,我们有可能是需要匹配比如说138-150之间所有数字开头的字符串,或者说A-F按字母表顺序内的字母开头,我们可以这样
^[138-150]* ^[A-F]* 反义之前我们谈论的都是字符串中含有什么什么,现在我们可能需要匹配到字符串中不含有的字符,那么我们就需要使用反义,如下表
| 元字符 | 说明 |
|:------:|:----------------------------------:|
| \W | 匹配不是字母、数字、下划线以及汉字 |
| \S | 匹配不是空白符 |
| \D | 匹配不是数字 |
| \B | 匹配不是单词的开始或结束 |
| [^x] | 匹配出了x以外的任意字符 |
贪婪是当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符,这匹配方式叫做贪婪匹配。特性:一次性读入整个字符串进行匹配,每当不匹配就舍弃最右边一个字符,继续匹配,依次匹配和舍弃(这种匹配-舍弃的方式也叫做回溯),直到匹配成功或者把整个字符串舍弃完为止,因此它是一种最大化的数据返回,能多不会少。
事实上我们之前所谈论的重复限定符就是一种贪婪量词
举个例子例如我们需要匹配由2-5个数字组成的字符串,假设有这样一串数字51354 8454 1 568,使用^\d{2,5}进行匹配的结果是51354 8454 568,事实上对于这些而言,匹配两个就已经满足了,例如51已经满足该正则式,但是在贪婪匹配中,它会尽可能的多匹配,将整个字符串输出。