C#每日一课(二十三)

40 篇文章 1 订阅

C#正则表达式
正则表达式就是使用一系列特殊字符模式,来表示某一类字符串。
.NET中提供了Regex类实现了验证正则表达式的方法。Regex类中包含静态方法,则可以在不对类进行实例化的情况下使用正则表达式中方法。

  • 正则表达式相关模式说明
模式说明
\转义字符,把一个具有特殊功能的字符转义为一个普通字符,或者是使用\加上普通字符表示特殊功能
^匹配输入字符串的开始位置
$匹配输入字符串的结束位置
*匹配前面的0次或多次子表达式
+匹配前面的一次或多次的子表达式(这里与*的区别在于至少匹配一次)
?匹配前面0次或一次子表达式(这里与*的区别在于它最多匹配一次)
{n}n是一个非负整数,匹配前面的n次子表达式
{n,}n是一个非负整数,至少匹配前面的n次子表达式
{n,m}m和n都是非负整数,其中n<=m,最少匹配n次且最多匹配m次
?当这个字符跟其它的限制字符(*,+,?,{n},{n,},{n,m})后面的话匹配模式会尽可能少地匹配所搜索的字符串
.匹配除了\n外的任意单个字符
(pattern)匹配pattern并获取这一匹配
(?:pattern)匹配pattern但并不获取匹配结果
(?=pattern)正向预查,在任何匹配pattern的字符串开始处匹配查找字符串
(?!pattern)反向预查,在任何不匹配pattern的字符串开始处匹配查找字符串
xy
[xyz]字符集合,匹配所包含的任意字符
[^xyz]这个与[xyz]相反,匹配未包含的任意字符
[a-z]匹配指定范围的任意字符
[^a-z]与[a-z]相反,匹配不在指定范围的任意字符
\b匹配单词的边界,指单词和空格间的位置
\B匹配非单词的边界
\d等价于[0-9],匹配一个数字字符
\D等价于[^0-9],匹配一个非数字字符
\f匹配一个换页符
\n匹配一个换行符
\r匹配一个回车符
\s匹配任何空白字符,包括空格、制表符、换页符等
\S匹配任何非空白字符
\t匹配一个制表符
\v匹配一个垂直制表符
\w匹配包括下划线的任何单词字符,等价于[A-Za-z0-9]
\W与\w相反,匹配任何非单词字符,等价于[^A-Za-z0-9_]
  • C#中正则表达式常用类Regex类
    常用方法
    1.静态Match方法
    使用Match方法可以得到源中第一个匹配模式的连续子串
    静态的Match方法有两个重载,分别是:
//参数是:输入、模式
Regex.Match(string input, string pattern);
//参数是:输入、模式、RegexOptions枚举的按位或组合
Regex.Match(string input, string pattern, RegexOptions options);

关于RegexOptins枚举的有效值如下:
Complied:编译此模式
CultureInvariant:不考虑文化背景
ECMAScript:符合ECMAScript,这个值只能与IgnoreCase、Multiline、Complied连用
ExplicitCapture:保存显示命名的组
IgnoreCase:不区分输入的大小写
IngorePatternWhitespace:去掉模式中的非转义空白,并启用由#标记的注释
Multiline:多行模式,改变元字符^和$的含义,它们可以匹配行的开头和结尾
None:无设置
RightToLeft:表示从右向左扫描、匹配,这个时候Match方法返回从右向左的第一个匹配
Singleline:单行模式,改变元字符.的含义,它可以匹配换行符

注意:Multiline在没有ECMAScript的情况下可以和Singleline连用Multiline和Singleline不互斥,但是与ECMAScript互斥

2.静态Matches方法
这个方法的重载形式与静态Match相同,返回一个MatchCollection,表示输入中匹配模式的匹配集合。

3.静态IsMatch方法
这个方法返回bool值,重载形式与静态Matchs相同,如果输入中匹配模式,返回true,否则返回false.
IsMatch方法可以理解为,返回Matches方法返回的集合是否为空。

Regex类非静态方法
1.字符串替换
Replace方法
注意:如果要使用Regex类则需要引用using System.Text.RegularExpressions;
使用Visual Studio 新增C#控制台应用程序chapter18_001
原生成的源文件开头处加上如下代码:

using System.Text.RegularExpressions;

在Main方法中加上如下代码进行测试

//源字符串
string str = "id=123;name=xiesheng;email=advent-86@163.com";
//模式
string pattern = "name=(.+);";
//把模式匹配到的字符串替换后的字符串
string re_str = "name=xiaoxie;";
Regex reg = new Regex(pattern);
Console.WriteLine("-----------------字符串替换Replace方法--------------------");
Console.WriteLine("源字符串:{0}", str);
Console.WriteLine("模式:{0}",pattern);

if (Regex.IsMatch(str, pattern))
{
        //当使用模式匹配到结果时执行语句
        string match = Regex.Match(str, pattern).ToString();
        Console.WriteLine("根据模式匹配到的字符串:{0}", match);
        Console.WriteLine("把匹配到的字符串替换为:{0}", re_str);
        string de_str = reg.Replace(str, re_str);
        Console.WriteLine("替换完成后的字符串为:{0}", de_str);
}
else
        //当使用模式未匹配到结果时执行语句
       Console.WriteLine("源字符串根据模式未匹配到字符串");
Console.ReadKey();

编译运行结果如下:
编译运行结果

2.匹配字符串
Match方法
前面说过Match静态方法中是提供了参数传入源字符串及匹配模式,如果使用实例化的对象调用Match方法则直接传入参数源字符串及可(在实例化Regex的时候已经使用模式进行过了初始化,即已经确定了匹配的模式)
比如上面的代码中可以把string match = Regex.Match(str, pattern).ToString();替换为string match = reg.Match(str).ToString();
编译运行的结果是一致的。

如查需要显示模式中匹配到的值可以把Main方法改造为如下:

using System.Text.RegularExpressions;

在Main方法中加上如下代码进行测试

//源字符串
string str = "id=123;name=xiesheng;email=advent-86@163.com";
//模式
string pattern = "name=(.+);";
//把模式匹配到的字符串替换后的字符串
string re_str = "name=xiaoxie;";
Regex reg = new Regex(pattern);
Console.WriteLine("-----------------字符串替换Replace方法--------------------");
Console.WriteLine("源字符串:{0}", str);
Console.WriteLine("模式:{0}",pattern);

if (Regex.IsMatch(str, pattern))
{
        //当使用模式匹配到结果时执行语句
        string match = Regex.Match(str, pattern).ToString();
        Console.WriteLine("根据模式匹配到的字符串:{0}", match);
        Console.WriteLine("把匹配到的字符串替换为:{0}", re_str);
        string de_str = reg.Replace(str, re_str);
        Console.WriteLine("替换完成后的字符串为:{0}", de_str);
		
		Console.WriteLine("-----------------提取匹配到的字符串的值--------------------");
        string value = reg.Match(str).Groups[1].Value;
        Console.WriteLine("匹配到的结果:{0}",value);
}
else
        //当使用模式未匹配到结果时执行语句
       Console.WriteLine("源字符串根据模式未匹配到字符串");
Console.ReadKey();

编译运行的结果如下:
编译运行结果

  • C#常用正则表达式
  • 校验数字表达式
//数字
Regex reg = new Regex(@"^[0-9]*$");
//n位数字
Regex reg = new Regex(@"^\d{n}$");
//至少n位数字
Regex reg = new Regex(@"^\d{n,}$");
//m~n位的数字
Regex reg = new Regex(@"^\d{m,n}$");
//0和非0开头的数字
Regex reg = new Regex(@"^(0|[1-9][0-9]*)$");
//非0开头的最多带两位小数的数字
Regex reg = new Regex(@"^([1-9][0-9]*)+(.[0-9]{1,2})?$");
//带1~2位小数的正数或负数
Regex reg = new Regex(@"^(\-)?\d+(\.\d{1,2})?$");
//正数、负数、小数
Regex reg = new Regex(@"^(\-|\+)?\d+(\.\d+)?$");
//有两位小数的正实数
Regex reg = new Regex(@"^[0-9]+(.[0-9]{2})?$");
//有1~3位小数的正实数
Regex reg = new Regex(@"^[0-9]+(.[0-9]{1,3})?$");
//非零的正整数
Regex reg = new Regex(@"^[1-9]\d*$");
Regex reg = new Regex(@"^([1-9][0-9]*){1,3}$"); 
Regex reg = new Regex(@"^\+?[1-9][0-9]*$");
//非零的负整数
Regex reg = new Regex(@"^\-[1-9][0-9]*$");
Regex reg = new Regex(@"^-[1-9]\d*$");
//非负整数
Regex reg = new Regex(@"^\d+$"); 
Regex reg = new Regex(@"^[1-9]\d*|0$");
//非正整数
Regex reg = new Regex(@"^-[1-9]\d*|0$");
Regex reg = new Regex(@"^((-\d+)|(0+))$");
//非负浮点数
Regex reg = new Regex(@"^\d+(\.\d+)?$"); 
Regex reg = new Regex(@"^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$");
//非正浮点数
Regex reg = new Regex(@"^((-\d+(\.\d+)?)|(0+(\.0+)?))$");
Regex reg = new Regex(@"^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$");
//正浮点数
Regex reg = new Regex(@"^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$"); 
Regex reg = new Regex(@"^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$");
//负浮点数
Regex reg = new Regex(@"^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$"); 
Regex reg = new Regex(@"^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$");
//浮点数
Regex reg = new Regex(@"^(-?\d+)(\.\d+)?$"); 
Regex reg = new Regex(@"^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$");
  • 校验字符表达式
//汉字
Regex reg = new Regex(@"^[\u4e00-\u9fa5]{0,}$");
//英文和数字
Regex reg = new Regex(@"^[A-Za-z0-9]+$");
Regex reg = new Regex(@"^[A-Za-z0-9]{4,40}$");
//长度为3~20的所有字符
Regex reg = new Regex(@"^.{3,20}$");
//由26个英文字母组成的字符串
Regex reg = new Regex(@"^[A-Za-z]+$");
//由26个大写英文字母组成的字符串
Regex reg = new Regex(@"^[A-Z]+$");
//由26个小写英文字母组成的字符串
Regex reg = new Regex(@"^[a-z]+$");
//由数字和26个英文字母组成的字符串
Regex reg = new Regex(@"^[A-Za-z0-9]+$");
//由数字、26个英文字母或者下划线组成的字符串
Regex reg = new Regex(@"^\w+$"); 
Regex reg = new Regex(@"^\w{3,20}$");
//中文、英文、数字包括下划线
Regex reg = new Regex(@"^[\u4E00-\u9FA5A-Za-z0-9_]+$");
//中文、英文、数字但不包括下划线等符号
Regex reg = new Regex(@"^[\u4E00-\u9FA5A-Za-z0-9]+$"); 
Regex reg = new Regex(@"^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$");
//可以输入含有^%&’,;=?$\”等字符
Regex reg = new Regex(@"[^%&’,;=?$\x22]+");
//禁止输入含有~的字符
Regex reg = new Regex(@"[^~\x22]+");
  • 特殊需求正则表达式
//Email地址
Regex reg = new Regex(@"^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$");
//域名
Regex reg = new Regex(@"[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?");
//InternetURL
Regex reg = new Regex(@"[a-zA-z]+://[^\s]*");
Regex reg = new Regex(@"^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$");
//手机号码
Regex reg = new Regex(@"^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$");
//国内电话号码(0511-4405222、021-87888822)
Regex reg = new Regex(@"\d{3}-\d{8}|\d{4}-\d{7}");
//身份证号(15位、18位数字)
Regex reg = new Regex(@"^\d{15}|\d{18}$");
//密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线)
Regex reg = new Regex(@"^[a-zA-Z]\w{5,17}$");
//强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间)
Regex reg = new Regex(@"^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$");
//IP地址
Regex reg = new Regex(@"\d+\.\d+\.\d+\.\d+");// (提取IP地址时有用)
//IP地址
Regex reg = new Regex(@"((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值