正则表达式RegularExpression(从字符串中获取想要的部分,判断给定的字符串是否符合正则表达式的过滤逻辑)

功能:
1.检索:从字符串中获取想要的部分
2.匹配:判断给定的字符串是否符合正则表达式的过滤逻辑。可以认为正则表达式表述了一个字符穿的书写规则

常用的操作正则表达式的方法和委托
下面学习一下位于System.Text.RegularExpressions下的Regex类的一些静态方法和委托
1,静态方法IsMatch (返回值是一个布尔类型,用于判断指定的字符串是否与正则表达式字符串匹配,它有三个重载方法)
  bool IsMatch(string input, string pattern);
  参数:   input:       要搜索匹配项的字符串。
  pattern:     要匹配的正则表达式模式。
  返回结果:  如果正则表达式找到匹配项,则为 true;否则,为 false。
  bool IsMatch(string input, string pattern, RegexOptions options);
  参数:   input:       要搜索匹配项的字符串。
  pattern:     要匹配的正则表达式模式。
  options:     枚举值的一个按位组合,这些枚举值提供匹配选项。
  返回结果:  如果正则表达式找到匹配项,则为 true;否则,为 false。
  bool IsMatch(string input, string pattern, RegexOptions options, TimeSpan matchTimeout);
  参数:   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,使用指定的匹配选项在输入字符串中搜索指定的正则表达式的第一个匹配项。 返回一个包含有关匹配的信息的对象。同样有三个重载方法,参数和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方法完全相同
 
  MatchCollection Matches(string input, string pattern);
  MatchCollection Matches(string input, string pattern, RegexOptions options);
  MatchCollection Matches(string input, string pattern, RegexOptions options, TimeSpan matchTimeout);

Replaces函数(System.Text.RegularExpressions)
我们知道正则表达式主要是实现验证,提取,分割,替换字符的功能.Replace函数是实现替换功能的.
1 )Replace(string input,string pattern,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,string pattern,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() 一起使用时,此断言确保所有匹配都是连续的。

示例一:  区配开始 ^
  string str = "I am Blue cat";          
  Console.WriteLine(Regex.Replace(str, "^","准备开始:"));
示例二: 区始结束 $
  string str = "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 a Cat!", 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));

对正则表达式分组()
用小括号来指定子表达式(也叫做分组)
示例一:重复单字符 和 重复分组字符
Console.WriteLine("请输入一个任意字符串,测试分组:");
string inputStr = Console.ReadLine();
string strGroup1 = @"a{2}";
Console.WriteLine("单字符重复2两次替换为22,结果为:"+Regex.Replace(inputStr, strGroup1,"22"));
//重复 多个字符 使用(abcd){n}进行分组限定
string strGroup2 = @"(ab\w{2}){2}";
Console.WriteLine("分组字符重复2两次替换为5555,结果为:" + Regex.Replace(inputStr, strGroup2, "5555"));
示例二:校验IP4地址(如:192.168.1.4,为四段,每段最多三位,每段最大数字为255,并且第一位不能为0)
string regexStrIp4 = @"^(((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?))$";
Console.WriteLine("请输入一个IP4地址:");
string inputStrIp4 = Console.ReadLine();
Console.WriteLine(inputStrIp4 + " 是否为合法的IP4地址:" + Regex.IsMatch(inputStrIp4, regexStrIp4));
Console.WriteLine("请输入一个IP4地址:");
string inputStrIp4Second = Console.ReadLine();          
Console.WriteLine(inputStrIp4 + " 是否为合法的IP4地址:" + Regex.IsMatch(inputStrIp4Second, regexStrIp4));

元字符
描述
\
将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,“ \\n ”匹配 \n 。“ \n ”匹配换行符。序列“ \\ ”匹配“ \ ”而“ \( ”则匹配“ ( ”。即相当于多种编程语言中都有的“转义字符”的概念。
^
匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性, ^ 也匹配“ \n ”或“ \r ”之后的位置。
$
匹配输入字符串的结束位置。如果设置了 RegExp 对象的 Multiline 属性, $ 也匹配“ \n ”或“ \r ”之前的位置。
*
匹配前面的子表达式任意次。例如, zo* 能匹配“ z ”,“ zo ”以及“ zoo ”。 * 等价于 {0,}
+
匹配前面的子表达式一次或多次 ( 大于等于 1 次)。例如,“ zo+ ”能匹配“ zo ”以及“ zoo ”,但不能匹配“ z ”。 + 等价于 {1,}
?
匹配前面的子表达式零次或一次。例如,“ do(es)? ”可以匹配“ do ”或“ does ”中的“ do ”。 ? 等价于 {0,1}
{n}
n 是一个非负整数。匹配确定的 n 次。例如,“ o{2} ”不能匹配“ Bob ”中的“ o ”,但是能匹配“ food ”中的两个 o
{n,}
n 是一个非负整数。至少匹配 n 次。例如,“ o{2,} ”不能匹配“ Bob ”中的“ o ”,但能匹配“ foooood ”中的所有 o 。“ o{1,} ”等价于“ o+ ”。“ o{0,} ”则等价于“ o* ”。
{n,m}
m n 均为非负整数,其中 n<=m 。最少匹配 n 次且最多匹配 m 次。例如,“ o{1,3} ”将匹配“ fooooood ”中的前三个 o 。“ o{0,1} ”等价于“ o? ”。请注意在逗号和两个数之间不能有空格。
?
当该字符紧跟在任何一个其他限制符( *,+,? {n} {n,} {n,m} )后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串“ oooo ”,“ o+? ”将匹配单个“ o ”,而“ o+ ”将匹配所有“ o ”。
.
匹配除“ \r\n ”之外的任何单个字符。要匹配包括“ \r\n ”在内的任何字符,请使用像“ [\s\S] ”的模式。
(pattern)
匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在 VBScript 中使用 SubMatches 集合,在 JScript 中则使用 $0 $9 属性。要匹配圆括号字符,请使用“ \( ”或“ \) ”。
(?:pattern)
匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用或字符“ (|) ”来组合一个模式的各个部分是很有用。例如“ industr(?:y|ies) ”就是一个比“ industry|industries ”更简略的表达式。
(?=pattern)
正向肯定预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,“ Windows(?=95|98|NT|2000) ”能匹配“ Windows2000 ”中的“ Windows ”,但不能匹配“ Windows3.1 ”中的“ Windows ”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
(?!pattern)
正向否定预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如“ Windows(?!95|98|NT|2000) ”能匹配“ Windows3.1 ”中的“ Windows ”,但不能匹配“ Windows2000 ”中的“ Windows ”。
(?<=pattern)
反向肯定预查,与正向肯定预查类似,只是方向相反。例如,“ (?<=95|98|NT|2000)Windows ”能匹配“ 2000Windows ”中的“ Windows ”,但不能匹配“ 3.1Windows ”中的“ Windows ”。
(?
反向否定预查,与正向否定预查类似,只是方向相反。例如“ (? ”能匹配“ 3.1Windows ”中的“ Windows ”,但不能匹配“ 2000Windows ”中的“ Windows ”。
x|y
匹配 x y 。例如,“ z|food ”能匹配“ z ”或“ food ”或 "zood"( 此处请谨慎 ) 。“ (z|f)ood ”则匹配“ zood ”或“ food ”。
[xyz]
字符集合。匹配所包含的任意一个字符。例如,“ [abc] ”可以匹配“ plain ”中的“ a ”。
[^xyz]
负值字符集合。匹配未包含的任意字符。例如,“ [^abc] ”可以匹配“ plain ”中的“ plin ”。
[a-z]
字符范围。匹配指定范围内的任意字符。例如,“ [a-z] ”可以匹配“ a ”到“ z ”范围内的任意小写字母字符。
注意 : 只有连字符在字符组内部时 , 并且出现在两个字符之间时 , 才能表示字符的范围 如果出字符组的开头 , 则只能表示连字符本身 .
[^a-z]
负值字符范围。匹配任何不在指定范围内的任意字符。例如,“ [^a-z] ”可以匹配任何不在“ a ”到“ z ”范围内的任意字符。
\b
匹配一个单词边界,也就是指单词和空格间的位置(即正则表达式的“匹配”有两种概念,一种是匹配字符,一种是匹配位置,这里的 \b 就是匹配位置的)。例如,“ er\b ”可以匹配“ never ”中的“ er ”,但不能匹配“ verb ”中的“ er ”。
\B
匹配非单词边界。“ er\B ”能匹配“ verb ”中的“ er ”,但不能匹配“ never ”中的“ er ”。
\cx
匹配由 x 指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。 x 的值必须为 A-Z a-z 之一。否则,将 c 视为一个原义的“ c ”字符。
\d
匹配一个数字字符。等价于 [0-9]
\D
匹配一个非数字字符。等价于 [^0-9]
\f
匹配一个换页符。等价于 \x0c \cL
\n
匹配一个换行符。等价于 \x0a \cJ
\r
匹配一个回车符。等价于 \x0d \cM
\s
匹配任何不可见字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]
\S
匹配任何可见字符。等价于 [^ \f\n\r\t\v]
\t
匹配一个制表符。等价于 \x09 \cI
\v
匹配一个垂直制表符。等价于 \x0b \cK
\w
匹配包括下划线的任何单词字符。类似但不等价于“ [A-Za-z0-9_] ”,这里的 " 单词 " 字符使用 Unicode 字符集。
\W
匹配任何非单词字符。等价于“ [^A-Za-z0-9_] ”。
\xn
匹配 n ,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,“ \x41 ”匹配“ A ”。“ \x041 ”则等价于“ \x04&1 ”。正则表达式中可以使用 ASCII 编码。
\num
匹配 num ,其中 num 是一个正整数。对所获取的匹配的引用。例如,“ (.)\1 ”匹配两个连续的相同字符。
\n
标识一个八进制转义值或一个向后引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为向后引用。否则,如果 n 为八进制数字( 0-7 ),则 n 为一个八进制转义值。
\nm
标识一个八进制转义值或一个向后引用。如果 \nm 之前至少有 nm 个获得子表达式,则 nm 为向后引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足,若 n m 均为八进制数字( 0-7 ),则 \nm 将匹配八进制转义值 nm
\nml
如果 n 为八进制数字( 0-7 ),且 m l 均为八进制数字( 0-7 ),则匹配八进制转义值 nml
\un
匹配 n ,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, \u00A9 匹配版权符号( © )。
\< \>
匹配词( word )的开始( \< )和结束( \> )。例如正则表达式 \ 能够匹配字符串 "for the wise" 中的 "the" ,但是不能匹配字符串 "otherwise" 中的 "the" 。注意:这个元字符不是所有的软件都支持的。
\( \)
 \(   \)  之间的表达式定义为“组”( group ),并且将匹配这个表达式的字符保存到一个临时区域(一个正则表达式中最多可以保存 9 个),它们可以用  \1  \9  的符号来引用。
|
将两个匹配条件进行逻辑“或”( Or )运算。例如正则表达式 (him|her)  匹配 "it belongs to him" "it belongs to her" ,但是不能匹配 "it belongs to them." 。注意:这个元字符不是所有的软件都支持的。
+
匹配 1 或多个正好在它之前的那个字符。例如正则表达式 9+ 匹配 9 99 999 等。注意:这个元字符不是所有的软件都支持的。
?
匹配 0 1 个正好在它之前的那个字符。注意:这个元字符不是所有的软件都支持的。
{i} {i,j}
匹配指定数目的字符,这些字符是在它之前的表达式定义的。例如正则表达式 A[0-9]{3}  能够匹配字符 "A" 后面跟着正好 3 个数字字符的串,例如 A123 A348 等,但是不匹配 A1234 。而正则表达式 [0-9]{4,6}  匹配连续的任意 4 个、 5 个或者 6 个数字



你可能感兴趣的:(c#)