什么是正则表达式?
英文Regular
Expression,是计算机科学的一个重要概念,她使用一种数学算法来解决计算机程序中的文本检索,匹配等问题,正则表达式语言是一种专门用于字符串处理的语言。在很多语言中都提供了对它的支持,c#也不例外,它可以帮我们解决下面的问题:
1,检索:通过正则表达式,从字符串中获取我们想要的部分
2,匹配:判断给定的字符串是否符合正则表达式的过滤逻辑
你可以认为正则表达式表述了一个字符串的书写规则
判断用户输入的密码是否合法,判断用户输入的邮箱格式是否合法
正则表达式的组成
正则表达式就是由普通字符以及特殊字符(成为元字符)组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。
常用的操作正则表达式的方法和委托
下面学习一下位于System.Text.RegularExpressions下的Regex类的一些静态方法和委托
1,静态方法IsMatch
(返回值是一个布尔类型,用于判断指定的字符串是否与正则表达式字符串匹配,它有三个重载方法)
bool
IsMatch(string input, string pattern);
参数:
input: 要搜索匹配项的字符串。
pattern: 要匹配的正则表达式模式。
返回结果: 如果正则表达式找到匹配项,则为 true;否则,为 false。
boolIsMatch(string input, string pattern, RegexOptions options);
参数:
input: 要搜索匹配项的字符串。
pattern: 要匹配的正则表达式模式。
options: 枚举值的一个按位组合,这些枚举值提供匹配选项。
返回结果: 如果正则表达式找到匹配项,则为 true;否则,为 false。
boolIsMatch(string input, string pattern, RegexOptions options, TimeSpanmatchTimeout);
参数:
input: 要搜索匹配项的字符串。
pattern: 要匹配的正则表达式模式。
options: 枚举值的一个按位组合,这些枚举值提供匹配选项。
matchTimeout:超时间隔,或 System.Text.RegularExpressions.Regex.InfiniteMatchTimeout 指示该方法不应超时。
返回结果: 如果正则表达式找到匹配项,则为 true;否则,为 false。
关于参数RegexOptions
它是一个枚举类型,有以下枚举值
RegexOptions枚举值 内联标志 简单说明
ExplicitCapture n 只有定义了命名或编号的组才捕获
IgnoreCase i 不区分大小写
IgnorePatternWhitespace x 消除模式中的非转义空白并启用由# 标记的注释。
MultiLine m 多行模式,其原理是修改了^和$的含义
SingleLine s 单行模式,和MultiLine相对应
内敛标志可以更小力度(一组为单位)的定义匹配选项
静态方法Match(System.Text.RegularExpressions)静态方法Match(System.Text.RegularExpressions)
静态方法Match,使用指定的匹配选项在输入字符串中搜索指定的正则表达式的第一个匹配项。
返回一个包含有关匹配的信息的对象。同样有三个重载方法,参数和IsMatch方法相同。此外,在Regex类中,还有一个同名的非静态方法,适用于多个实例的情况下,效率更高一些。
Match Match(string input, string pattern);
Match Match(string input, string pattern, RegexOptions options);
Match Match(string input, string pattern, RegexOptions options, TimeSpan matchTimeout);
静态方法Matches(System.Text.RegularExpressions)
静态方法Matches,在指定的输入字符串中搜索指定的正则表达式的所有匹配项。跟上面方法不同之处,就是这个方法返回的是所有匹配项,他同样有三个重载方法,并且参数和Match方法完全相同
MatchCollectionMatches(string input, string pattern);
MatchCollectionMatches(string input, string pattern, RegexOptions options);
MatchCollectionMatches(string input, string pattern, RegexOptions options, TimeSpanmatchTimeout);
Replaces函数(System.Text.RegularExpressions)
我们知道正则表达式主要是实现验证,提取,分割,替换字符的功能.Replace函数是实现替换功能的.
1 )Replace(string input,stringpattern,string replacement)
//input是源字符串,pattern是匹配的条件,replacement是替换的内容,就是把符合匹配条件pattern的内容转换成它
比如string result =Regex.Replace("abc", "ab", "##");
//结果是##c,就是把字符串abc中的ab替换成##
2 )Replace(string input,string pattern,string replacement,RegexOptions options)
//RegexOptions是一个枚举类型,用来做一些设定.
//前面用注释时就用到了RegexOptions.IgnorePatternWhitespace.如果在匹配时忽略大小写就可以用RegexOptions.IgnoreCase
比如string result =Regex.Replace("ABc", "ab", "##",RegexOptions.IgnoreCase);
如果是简单的替换用上面两个函数就可以实现了.但如果有些复杂的替换,比如匹配到很多内容,不同的内容要替换成不同的字符.就需要用到下面两个函数
3 )Replace(string input,stringpattern,MatchEvaluator evaluator);
//evaluator是一个代理,其实简单的说是一个函数指针,把一个函数做为参数参进来
//由于C#里没有指针就用代理来实现类似的功能.你可以用代理绑定的函数来指定你要实现的复杂替换.
4 )Replace(string input,string pattern,MatchEvaluator evaluator,RegexOptions options);
//这个函数上上面的功能一样,只不过多了一点枚举类型来指定是否忽略大小写等设置
静态方法Split拆分文本
使用正则表达式匹配的位置,将文本拆分为一个字符串数组,同样有三个重载方法,返回值为字符串数组
string[] Split(string input, string pattern);
string[] Split(string input, string pattern, RegexOptions options);
string[] Split(string input, string pattern, RegexOptions options, TimeSpan matchTimeout);
@符号
我们经常在正则表达式字符串前面加上@字符,这样不让编译器去解析其中的转义字符,而作为正则表达式的语法(元字符)存在。
string s =@"www.baidu.com \n lkjsdflkj";
定位元字符
我们经常在正则表达式字符串前面加上@字符,这样不让编译器去解析其中的转义字符,而作为正则表达式的语法(元字符)存在。
字符 说明
\b 匹配单词的开始或结束
\B 匹配非单词的开始或结束
^ 匹配必须出现在字符串的开头或行的开头
$ 匹配必须出现在以下位置:字符串结尾、字符串结尾处的\n 之前或行的结尾。
\A 指定匹配必须出现在字符串的开头(忽略Multiline 选项)。
\z 指定匹配必须出现在字符串的结尾(忽略Multiline 选项)。
\z 指定匹配必须出现在字符串的结尾或字符串结尾处的\n 之前(忽略 Multiline 选项)。
\G 指定匹配必须出现在上一个匹配结束的地方。与Match.NextMatch() 一起使用时,此断言确保所有匹配都是连续的。
定位元字符示例
示例一: 区配开始^
stringstr = "I am Blue cat";
Console.WriteLine(Regex.Replace(str,"^","准备开始:"));
示例二: 区始结束 $
stringstr = "I am Blue cat";
Console.WriteLine(Regex.Replace(str,"$", " 结束了!"));
基本语法元字符
字符 说明
. 匹配除换行符以外的任意字符
\w 匹配字母、数字、下划线、汉字 (指大小写字母、0-9的数字、下划线_)
\W \w的补集 ( 除“大小写字母、0-9的数字、下划线_”之外)
\s 匹配任意空白符 (包括换行符/n、回车符/r、制表符/t、垂直制表符/v、换页符/f)
\S \s的补集 (除\s定义的字符之外)
\d 匹配数字 (0-9数字)
\D 表示\d的补集 (除0-9数字之外)
在正则表达式中,\是转义字符. * 是元字符 如果要表示一个\ .
*字符的话,需要使用\\ \. \*
示例
示例一:校验只允许输入数字
string strCheckNum1 =
"23423423a3", strCheckNum2 = "324234";
Console.WriteLine("匹配字符串"+strCheckNum1+"是否为数字:"+Regex.IsMatch(strCheckNum1,@"^\d*$"));
Console.WriteLine("匹配字符串" +strCheckNum2 + "是否为数字:" + Regex.IsMatch(strCheckNum2,@"^\d*$"));
示例二:校验只允许输入除大小写字母、0-9的数字、下划线_以外的任何字
string strCheckStr1 ="abcds_a", strCheckStr2 = "**&&((((2", strCheckStr3= "**&&((((";
string regexStr = @"^\W*$";
Console.WriteLine("匹配字符串" +strCheckStr1 + "是否为除大小写字母、0-9的数字、下划线_以外的任何字符:" +Regex.IsMatch(strCheckStr1, regexStr));
Console.WriteLine("匹配字符串" +strCheckStr2 + "是否为除大小写字母、0-9的数字、下划线_以外的任何字符:" +Regex.IsMatch(strCheckStr2, regexStr));
Console.WriteLine("匹配字符串" +strCheckStr3 + "是否为除大小写字母、0-9的数字、下划线_以外的任何字符:" +Regex.IsMatch(strCheckStr3, regexStr));
反义字符
字符 说明
\W \w的补集 ( 除“大小写字母、0-9的数字、下划线_”之外)
\S \s的补集 (除\s定义的字符之外)
\D 表示\d的补集 (除0-9数字之外)
\B 匹配不是单词开头或结束的位置
[ab] 匹配中括号中的字符
[a-c] a字符到c字符之间是字符
[^x] 匹配除了x以外的任意字符
[^adwz] 匹配除了adwz这几个字符以外的任意字符
//示例:查找除ahou这之外的所有字符
string strFind1 = "I am aCat!", strFind2 = "My Name's Blue cat!";
Console.WriteLine("除ahou这之外的所有字符,原字符为:"+ strFind1 + "替换后:" + Regex.Replace(strFind1,@[^ahou]","*"));
Console.WriteLine("除ahou这之外的所有字符,原字符为:"+ strFind2 + "替换后:" + Regex.Replace(strFind2, @"[^ahou]", "*"));
重复描述字符
字符 说明
{n} 匹配前面的字符n次
{n,} 匹配前面的字符n次或多于n次
{n,m} 匹配前面的字符n到m次
? 重复零次或一次
+ 重复一次或更多次
* 重复零次或更多次
示例:校验输入内容是否为合法QQ号(备注:QQ号为5-12位数字)
string isQq1 = "1233", isQq2 ="a1233", isQq3 = "0123456789123", isQq4 ="556878544";
string regexQq = @"^\d{5,12}$";
Console.WriteLine(isQq1+"是否为合法QQ号(5-12位数字):"+ Regex.IsMatch(isQq1, regexQq));
Console.WriteLine(isQq2 +"是否为合法QQ号(5-12位数字):" + Regex.IsMatch(isQq2, regexQq));
Console.WriteLine(isQq3 +"是否为合法QQ号(5-12位数字):" + Regex.IsMatch(isQq3, regexQq));
Console.WriteLine(isQq4 +"是否为合法QQ号(5-12位数字):" + Regex.IsMatch(isQq4, regexQq));
择一匹配
字符 说明
| 将两个匹配条件进行逻辑“或”(Or)运算。
示例一:查找数字或字母
string findStr1 = "ad(d3)-df";
string regexFindStr =@"[a-z]|\d";
string newStrFind=String.Empty;
MatchCollection newStr = Regex.Matches(findStr1, regexFindStr);
newStr.Cast().Select(m =>m.Value).ToList().ForEach(i => newStrFind += i);
Console.WriteLine(findStr1 +"中的字母和数字组成的新字符串为:" + newStrFind);
示例二:将人名输出("zhangsan;lisi,wangwu.zhaoliu")
string strSplit ="zhangsan;lisi,wangwu.zhaoliu";
string regexSplitstr =@"[;]|[,]|[.]";
Regex.Split(strSplit,regexSplitstr).ToList().ForEach(i => Console.WriteLine(i));
示例三:校验国内电话号码
(支持三种写法校验 A. 010-87654321 B.(010)87654321 C.01087654321 D.010 87654321)
string TelNumber1 ="(010)87654321", TelNumber2 = "010-87654321", TelNumber3 ="01087654321",
TelNumber4 = "09127654321", TelNumber5 ="010)87654321",TelNumber6="(010-87654321",
TelNumber7="91287654321";
Regex RegexTelNumber3 = new Regex(@"\(0\d{2,3}\)[- ]?\d{7,8}|^0\d{2,3}[- ]?\d{7,8}$");
Console.WriteLine("电话号码 " +TelNumber1 + " 是否合法:" + RegexTelNumber3.IsMatch(TelNumber1));
Console.WriteLine("电话号码 " +TelNumber2 + " 是否合法:" + RegexTelNumber3.IsMatch(TelNumber2));
Console.WriteLine("电话号码 " +TelNumber3 + " 是否合法:" + RegexTelNumber3.IsMatch(TelNumber3));
Console.WriteLine("电话号码 " +TelNumber4 + " 是否合法:" + RegexTelNumber3.IsMatch(TelNumber4));
Console.WriteLine("电话号码 " +TelNumber5 + " 是否合法:" + RegexTelNumber3.IsMatch(TelNumber5));
Console.WriteLine("电话号码 " +TelNumber6 + " 是否合法:" + RegexTelNumber3.IsMatch(TelNumber6));
Console.WriteLine("电话号码 " +TelNumber7 + " 是否合法:" + RegexTelNumber3.IsMatch(TelNumber7));