C#正则表达式的基础应用

《C#正则表达式的基础应用》
开发工具与关键技术:Visual Studio / MVC
作者:肖春庆
撰写时间:2019年04月21日
正则表达式是应用来进行文本匹配的工具。开发者在开发软件的时候,一般在用户填写信息框进行设置判断填写的信息是否正确填写,并且提示用户的正确写法,也就是查找符合某些复杂规则的字符串的需求和记录文本规则的代码。正则的进行匹配和替换信息是否按要求读取。它的每一个文字都有我们对应的信息类型,也就是开发者在编写的时候规定用户只能填写文字的时候,用户在视图填写的信息类型是否是文字的,我们要进行正确的匹配,这个时候我们就要利用正则进行用户只能填写文字才可以进行下一步的操作。
通常我们要集和元字符的规则进行文本的匹配:
在这里插入图片描述
在正则表达式中,编写规定的匹配文本类型的代码,然后替换文本是否读取正确。例如:我们要匹配用户是否正确填写QQ号码。我们知道QQ号码由5至12阿拉伯数字组成,我们要匹配用户是否正确填写5至12阿拉伯数字,可以应用代码:^\d{5,12}KaTeX parse error: Expected 'EOF', got '\d' at position 22: …:^代码表示匹配字符串的开始,\̲d̲代码表示匹配字符串为数字类型,…代码表示匹配到此结束。
反面意思,我们知道\w是匹配字母、数字和下划线,而且\W是匹配不是字母、数字和下划线的文本。英文字母的大小写的意思刚好相反。
\d只是匹配数字而\D匹配所有不是数字。
\s匹配所有的空白字符,而\S匹配所有不是空白字符。
\b匹配英文单词的开始位置或者结束位置,而\D匹配的不是英文单词的开始位置或者结束位置。如此类推。
注意:x只匹配x而[x] 匹配除x以外的字符;abcdef只匹配abcdef而[abcdef匹配除abcdef以外的字符, 反意需要借用[ ]使用。
我们可以使用*,+,{2},{5,12}这几个匹配重复的方式了进行限定重复匹配的次数。
代码*:表示重复匹配零次或者匹配更多次。 代码+:表示重复匹配一次或者匹配更多次。
代码?:表示重复匹配零次或者匹配更一次。
代码{n}:表示重复匹配n次,例如{3}表示重复匹配3次。
代码{n,}:表示重复匹配n次或者匹配更多次。例如:{5,} 匹配5次或者匹配大于5次。
代码{n,m}:表示重复匹配n次到m次。例如:{3,5}匹配3次到匹配5次。
在这里插入图片描述
为了规范的编程正则表达式,当正则表达式中包含能接受重复的限定符时,我们要在使整个表达式能得到匹配的前提下尽量匹配更多字符。我们要应用贪婪匹配,它可以匹配整个字符。但是我们有时候要尽可能匹配少一些字符,需要贪婪的匹配模式。
我们要应用贪婪匹配,它可以匹配整个字符。但是我们有时候要尽可能匹配少一些字符,需要贪婪的匹配模式。前面我们明白的限定符,只要在它后面加上一个问号?,就可以被转化为懒惰匹配模式。代码{n,}:表示重复匹配n次或者匹配更多次;代码{n,}?:表示重复匹配n次以上,但尽可能匹配少重复。代码{n,m}:表示重复匹配n次到m次。代码{n,m}?:表示重复匹配n次到m次,但尽可能匹配少重复。如此类推。在开发者设定的规则时,有多种规则,如果满足其中任意一种规则都应该当成匹配,具体方法是用|把不同的规则分隔开,这就是正则表达式里的替换。
例如:匹配一个电话号码,其中3位区号,也可以用小括号括起来,也可以不用小括号括起来,区号和号码用空格或者连字号做间隔,与可以不用。应用|把多种可以分开。
实现代码:(0\d{2})[- ]?\d{8}|0\d{2}[- ]?\d{8}。
选项能用来改变处理正则表达式的方式,C#中常用的正则表达式选项如下:
在这里插入图片描述
注意不是只能同时使用多行模式和单行模式中的一种。
验证用户输入身份证的合法性,我们知道我国的身份证号码分别有15位数字和18位数字,那么应该如何进行正确的匹配呢?
身份证的号码的前两位为出生人的地方所在的省份或者直辖市的编号,第一位是由中华的华东南西北进行排序,第二位是按省份或者直辖市的排序,组成固定的二位数字。第一步,只能匹配前面组成固定的二位数字不可以匹配组成固定的二位数字以外的数字。其中第3位到第4位为地方市区或者自治州的编号。声明一个变量记录第3位到第4位,进行正确的匹配,第5位到第6位,为地方县区或者自治旗的编号,进行正确的匹配。所以说前面6位身份证号码是由身份证人的出生地方固定的,正确匹配。如果用户填写错误,并且提示用户正确填写。
在这里插入图片描述
身份证号码的第7位到第14位是持有人的出生日期,把年月日的形式转换成8位数字,如果持有人的出生日期为2019年05月07日,则持有人身份证号码的第7位到第14位转换成20190507。注意当代持有人出生的时间,现在人出生在1900年以后,在今天以前。这样我们确定了匹配持有人出生年份。
在这里插入图片描述
一年有12个月,所以身份证号码的第11位要么是0要么是1并且11位和12位组成的十进制不能大于12。一个月有时候30天,有时候是31天,所以身份证号码的第13位和14位为小于31的十进制。如果由11位和12位组成的十进制为02的时候,第13位和14位组成的十进制不能大于29。身份证号码的第15位为持有人身份证所在的派出所的编号,阿拉伯数字0到9都行。16位到18位为当地出生人的排序,其中的第18位为0时用X来表达,所以第18位不能为0可以为X。总体来说身份证前17位都为阿拉伯数字;其中的第18位不能为0,可以为X。
C#正则表达式可以嵌套层次结构,匹配两者个数不相同,我们需要应用到语法架构。
需要用到的语法架构:

  1. (?‘group’) 把捕获的内容命名为group,并压入堆栈
  2. (?’-group’) 从堆栈上弹出最后压入堆栈的名为group的捕获内容,如果堆栈本来为空,则本分组的匹配失败
  3. (?(group)yes|no) 如果堆栈上存在以名为group的捕获内容的话,继续匹配yes部分的表达式,否则继续匹配no部分
  4. (?!) 零宽负向先行断言,由于没有后缀表达式,试图匹配总是失败
    例如:把xx <aa aa> yy这样的字符串里,最长的配对的尖括号内的内容捕获出来。平衡组的一个最常见的应用就是匹配HTML,下面这个例子可以匹配嵌套的
    标签:<div[ >]*>[<>] (((?‘Open’<div[>]*>)[<>])+((?’-Open’
    )[^<>])+)(?(Open)(?!))。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值