正则表达式概念
英文Regular Expression 是计算机科学的一个重要概念,使用一种数学算法来解决计算机程序中的文本检索,匹配等问题。主要用于解决下面的问题:
1、检索:通过正则表达式,从字符串中获取我们想要的部分
2、判断给定的字符串是否符合正则表达式的过滤逻辑,可以认为正则表达式表述了一个字符串的书写规则
在C#中位于命名空间System.Text.RegularExpressions下
定位元字符
- ^ :匹配必须出现在字符串的开头或者行的开头
- $ :匹配必须出现在以下的位置:字符串结尾、字符串结尾处的 \n 之前或者行的结尾
string str = "Start Leanrning Net Core!";
string begin = Regex.Replace(str, "^", "开始:");
string end = Regex.Replace(str, "$", "结束");
Console.WriteLine(str);
Console.WriteLine(begin);
Console.WriteLine(end);
输出结果:
Start Leanrning Net Core!
开始:Start Leanrning Net Core!
Start Leanrning Net Core!结束
- \b :匹配单词的开始或结束
- \B:匹配非单词的开始或结束
- \A:指定匹配必须出现在字符串的开头
- \Z:指定匹配必须出现在字符串的末尾或出现在字符串末尾的 \n 之前。
- \z:指定匹配必须出现在字符串的末尾
- \G:指定匹配必须出现在上一个匹配结束的地方。与 Match.NextMatch() 一起使用时,此确保所有的匹配时连续的。
基本语法元字符
- . :匹配除换行符以外的任意字符
- \w:匹配字母、数字、下划线
- \W:\w的补集(除“大小写字母、0-9数字、下划线”之外)
- \s:匹配任意空白字符(包括换行符\n,回车符\r,制表符\t,垂直制表符\v,换页符\f)
- \S:\s的补集
- \d:匹配数字(0-9数字)
- \D:\d的补集(除0-9数字之外)
string str = "12345447";
string pattern = @"^\d*$";//此处*表示匹配0个或者多个,但是*不属于元字符
Console.WriteLine(Regex.IsMatch(str, pattern));
输出结果为:True
反义字符
- \W:\w的补集
- \D:\d的补集(除0-9数字之外)
- \S:\s的补集
- \B:匹配非单词的开始或结束
- [ab] :匹配中括号中的字符
- [a-h]:匹配a到h之间的字符
- [^x]:匹配除了x之外的字符
string str = "I am a Cat";
string pattern = @"[^at]";//匹配除了at之外的所有字符
Console.WriteLine(Regex.Replace(str, pattern,"*"));
输出结果:
**a**a**at
重复描述字符
-
{n}
:匹配前面的字符n次 -
{n,}
:匹配前面的字符n次或多于n次 -
{n,m}
:匹配前面的字符n到m次 -
?
:重复零次或者一次 -
+
:重复一次或者多次 -
*
:重复零次或者多次
//匹配QQ号:5~12位的纯数字
string qq_1 = "125348";
string qq_2 = "1354684864846884";
string qq_3 = "X35345388486";
string pattern = @"^\d{5,12}$";
Console.WriteLine(Regex.IsMatch(qq_1, pattern));
Console.WriteLine(Regex.IsMatch(qq_2, pattern));
Console.WriteLine(Regex.IsMatch(qq_3, pattern));
输出结果:
True
False
False
择一匹配和分组
- | :将两个匹配条件进行逻辑“或”(Or)运算
- ():用小括号来指定子表达式(也叫做分组)
//提取符合的身份证号码
string id = "dsadasd510122196902300285fasf";
string pattern = @"[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9]|10|20|30|31))\d{3}[0-9Xx]";
var matchs = Regex.Matches(id, pattern);
foreach (var match in matchs)
{
Console.WriteLine(match.ToString());
}
输出结果:
510122196902300285
正则表达说明:
[1-9]\d{5} 前六位地区,非0打头
(18|19|([23]\d))\d{2} 出身年份,覆盖范围为 1800-3999 年
((0[1-9])|(10|11|12)) 月份,01-12月
(([0-2][1-9])|10|20|30|31) 日期,01-31天
\d{3}[0-9Xx]: 顺序码三位 + 一位校验码
其实以上正则表达式还是有问题,在如果月份日期码0230也会认为是正确的身份证号码
//匹配IP地址
string id = "192.168.255.256";
string pattern = @"^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$";
Console.WriteLine(Regex.IsMatch(id, pattern));
输出结果:
False
正则表达式说明:
Ip地址的格式为:192.168.1.1分为四段,每段的范围均为0~255,因此需要匹配的有以下几位情况:
1、只有两位数或者一位数:取值0~99,不用做限制只要是数字即可,正则表达式为[01]?\d\d?)
2、三位数:
如果百位数为1,则十位数和个位数不用做限制;
如果百位数为2:如果十位数在0-4的范围内个位数不用做限制:2[0-4]\d
但是如果十位数是5,那个数不能超过5:25[0-5]