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的字符串开始处匹配查找字符串 |
x | y |
[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))");