C# 学习 ——正则表达式

正则表达式概念

英文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,那个数不能超过525[0-5]


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值