您现在的位置: 365建站网 > 365文章 > C# 正则表达式的使用实例详解

C# 正则表达式的使用实例详解

文章来源:365jz.com     点击数:864    更新时间:2018-10-25 08:28   参与评论

C# 正则表达式

正则表达式 是一种匹配输入文本的模式。.Net 框架提供了允许这种匹配的正则表达式引擎。模式由一个或多个字符、运算符和结构组成。正则表达式的本质是使用一系列特殊字符模式,来表示某一类字符串。正则表达式无疑是处理文本最有力的工具,而.NET提供的Regex类实现了验证正则表达式的方法。Regex 类表示不可变(只读)的正则表达式。它还包含各种静态方法,允许在不显式创建其他类的实例的情况下使用其他正则表达式类。

基础梳理




定义正则表达式

下面列出了用于定义正则表达式的各种类别的字符、运算符和结构。

  • 字符转义

  • 字符类

  • 定位点

  • 分组构造

  • 限定符

  • 反向引用构造

  • 备用构造

  • 替换

  • 杂项构造

字符转义

正则表达式中的反斜杠字符(\)指示其后跟的字符是特殊字符,或应按原义解释该字符。

下表列出了转义字符:


转义字符描述模式匹配
\a与报警 (bell) 符 \u0007 匹配。\a"Warning!" + '\u0007' 中的 "\u0007"
\b在字符类中,与退格键 \u0008 匹配。[\b]{3,}"\b\b\b\b" 中的 "\b\b\b\b"
\t与制表符 \u0009 匹配。(\w+)\t"Name\tAddr\t" 中的 "Name\t" 和 "Addr\t"
\r与回车符 \u000D 匹配。(\r 与换行符 \n 不是等效的。)\r\n(\w+)"\r\Hello\nWorld." 中的 "\r\nHello"
\v与垂直制表符 \u000B 匹配。[\v]{2,}"\v\v\v" 中的 "\v\v\v"
\f与换页符 \u000C 匹配。[\f]{2,}"\f\f\f" 中的 "\f\f\f"
\n与换行符 \u000A 匹配。\r\n(\w+)"\r\Hello\nWorld." 中的 "\r\nHello"
\e与转义符 \u001B 匹配。\e"\x001B" 中的 "\x001B"
\ nnn使用八进制表示形式指定一个字符(nnn 由二到三位数字组成)。\w\040\w"a bc d" 中的 "a b" 和 "c d"
\x nn使用十六进制表示形式指定字符(nn 恰好由两位数字组成)。\w\x20\w"a bc d" 中的 "a b" 和 "c d"
\c X \c x匹配 X 或 x 指定的 ASCII 控件字符,其中 X 或 x 是控件字符的字母。\cC"\x0003" 中的 "\x0003" (Ctrl-C)
\u nnnn使用十六进制表示形式匹配一个 Unicode 字符(由 nnnn 表示的四位数)。\w\u0020\w"a bc d" 中的 "a b" 和 "c d"
\在后面带有不识别的转义字符时,与该字符匹配。\d+[\+-x\*]\d+\d+[\+-x\*\d+"(2+2) * 3*9" 中的 "2+2" 和 "3*9"



说明:

由于在正则表达式中“ \ ”、“ ? ”、“ * ”、“ ^ ”、“ $ ”、“ + ”、“(”、“)”、“ | ”、“ { ”、“ [ ”等字符已经具有一定特殊意义,如果需要用它们的原始意义,则应该对它进行转义,例如 希 望在字符串中至少有一个“ \ ”,那么正则表达式应该这么写: \\+ 。


字符类

字符类与一组字符中的任何一个字符匹配。

下表列出了字符类:

字符类描述模式匹配
[character_group]匹配 character_group 中的任何单个字符。 默认情况下,匹配区分大小写。[mn]"mat" 中的 "m","moon" 中的 "m" 和 "n"
[^character_group]非:与不在 character_group 中的任何单个字符匹配。 默认情况下,character_group 中的字符区分大小写。[^aei]"avail" 中的 "v" 和 "l"
[ first - last ]字符范围:与从 first 到 last 的范围中的任何单个字符匹配。[b-d][b-d]irds 可以匹配 Birds、 Cirds、 Dirds
.通配符:与除 \n 之外的任何单个字符匹配。 
若要匹配原意句点字符(. 或 \u002E),您必须在该字符前面加上转义符 (\.)。
a.e"have" 中的 "ave", "mate" 中的 "ate"
\p{ name }与 name 指定的 Unicode 通用类别或命名块中的任何单个字符匹配。\p{Lu}"City Lights" 中的 "C" 和 "L"
\P{ name }与不在 name 指定的 Unicode 通用类别或命名块中的任何单个字符匹配。\P{Lu}"City" 中的 "i"、 "t" 和 "y"
\w与任何单词字符匹配。\w"Room#1" 中的 "R"、 "o"、 "m" 和 "1"
\W与任何非单词字符匹配。\W"Room#1" 中的 "#"
\s与任何空白字符匹配。\w\s"ID A1.3" 中的 "D "
\S与任何非空白字符匹配。\s\S"int __ctr" 中的 " _"
\d与任何十进制数字匹配。\d"4 = IV" 中的 "4"
\D匹配不是十进制数的任意字符。\D"4 = IV" 中的 " "、 "="、 " "、 "I" 和 "V"

定位点

定位点或原子零宽度断言会使匹配成功或失败,具体取决于字符串中的当前位置,但它们不会使引擎在字符串中前进或使用字符。

下表列出了定位点:

断言描述模式匹配
^匹配必须从字符串或一行的开头开始。^\d{3}"567-777-" 中的 "567"
$匹配必须出现在字符串的末尾或出现在行或字符串末尾的 \n 之前。-\d{4}$"8-12-2012" 中的 "-2012"
\A匹配必须出现在字符串的开头。\A\w{4}"Code-007-" 中的 "Code"
\Z匹配必须出现在字符串的末尾或出现在字符串末尾的 \n之前。-\d{3}\Z"Bond-901-007" 中的 "-007"
\z匹配必须出现在字符串的末尾。-\d{3}\z"-901-333" 中的 "-333"
\G匹配必须出现在上一个匹配结束的地方。\G\(\d\)"(1)(3)(5)[7](9)" 中的 "(1)"、 "(3)" 和 "(5)"
\b匹配一个单词边界,也就是指单词和空格间的位置。er\b匹配"never"中的"er",但不能匹配"verb"中的"er"。
\B匹配非单词边界。er\B匹配"verb"中的"er",但不能匹配"never"中的"er"。

分组构造

分组构造描述了正则表达式的子表达式,通常用于捕获输入字符串的子字符串。

下表列出了分组构造:

分组构造描述模式匹配
( subexpression )捕获匹配的子表达式并将其分配到一个从零开始的序号中。(\w)\1"deep" 中的 "ee"
(?< name >subexpression)将匹配的子表达式捕获到一个命名组中。(?< double>\w)\k< double>"deep" 中的 "ee"
(?< name1 -name2 >subexpression)定义平衡组定义。(((?'Open'\()[^\(\)]*)+((?'Close-Open'\))[^\(\)]*)+)*(?(Open)(?!))$"3+2^((1-3)*(3-1))" 中的 "((1-3)*(3-1))"
(?: subexpression)定义非捕获组。Write(?:Line)?"Console.WriteLine()" 中的 "WriteLine"
(?imnsx-imnsx:subexpression)应用或禁用 subexpression 中指定的选项。A\d{2}(?i:\w+)\b"A12xl A12XL a12xl" 中的 "A12xl" 和 "A12XL"
(?= subexpression)零宽度正预测先行断言。\w+(?=\.)"He is. The dog ran. The sun is out." 中的 "is"、 "ran" 和 "out"
(?! subexpression)零宽度负预测先行断言。\b(?!un)\w+\b"unsure sure unity used" 中的 "sure" 和 "used"
(?<=subexpression)零宽度正回顾后发断言。(?<=19)\d{2}\b"1851 1999 1950 1905 2003" 中的 "99"、"50"和 "05"
(?<! subexpression)零宽度负回顾后发断言。(?"Hi woman Hi man" 中的 "man"
(?> subexpression)非回溯(也称为"贪婪")子表达式。[13579](?>A+B+)"1ABB 3ABBC 5AB 5AC" 中的 "1ABB"、 "3ABB" 和 "5AB"

实例

</>code

  1. using System;using System.Text.RegularExpressions;public class Example{
  2.    public static void Main()
  3.    {
  4.       string input = "1851 1999 1950 1905 2003";
  5.       string pattern = @"(?<=19)\d{2}\b";
  6.       foreach (Match match in Regex.Matches(input, pattern))
  7.          Console.WriteLine(match.Value);
  8.    }}


限定符

限定符指定在输入字符串中必须存在上一个元素(可以是字符、组或字符类)的多少个实例才能出现匹配项。 限定符包括下表中列出的语言元素。

下表列出了限定符:

限定符描述模式匹配
*匹配上一个元素零次或多次。\d*\.\d".0"、 "19.9"、 "219.9"
+匹配上一个元素一次或多次。"be+""been" 中的 "bee", "bent" 中的 "be"
?匹配上一个元素零次或一次。"rai?n""ran"、 "rain"
{ n }匹配上一个元素恰好 n 次。",\d{3}""1,043.6" 中的 ",043", "9,876,543,210" 中的 ",876"、 ",543" 和 ",210"
{ n ,}匹配上一个元素至少 n 次。"\d{2,}""166"、 "29"、 "1930"
{ n , m }匹配上一个元素至少 n 次,但不多于 m 次。"\d{3,5}""166", "17668", "193024" 中的 "19302"
*?匹配上一个元素零次或多次,但次数尽可能少。\d*?\.\d".0"、 "19.9"、 "219.9"
+?匹配上一个元素一次或多次,但次数尽可能少。"be+?""been" 中的 "be", "bent" 中的 "be"
??匹配上一个元素零次或一次,但次数尽可能少。"rai??n""ran"、 "rain"
{ n }?匹配前导元素恰好 n 次。",\d{3}?""1,043.6" 中的 ",043", "9,876,543,210" 中的 ",876"、 ",543" 和 ",210"
{ n ,}?匹配上一个元素至少 n 次,但次数尽可能少。"\d{2,}?""166"、 "29" 和 "1930"
{ n , m }?匹配上一个元素的次数介于 n 和 m 之间,但次数尽可能少。"\d{3,5}?""166", "17668", "193024" 中的 "193" 和 "024"

反向引用构造

反向引用允许在同一正则表达式中随后标识以前匹配的子表达式。

下表列出了反向引用构造:

反向引用构造描述模式匹配
\ number反向引用。 匹配编号子表达式的值。(\w)\1"seek" 中的 "ee"
\k< name >命名反向引用。 匹配命名表达式的值。(?< char>\w)\k< char>"seek" 中的 "ee"

备用构造

备用构造用于修改正则表达式以启用 either/or 匹配。

下表列出了备用构造:

备用构造描述模式匹配
|匹配以竖线 (|) 字符分隔的任何一个元素。th(e|is|at)"this is the day. " 中的 "the" 和 "this"
(?( expression )yes | no )如果正则表达式模式由 expression 匹配指定,则匹配 yes;否则匹配可选的 no部分。 expression 被解释为零宽度断言。(?(A)A\d{2}\b|\b\d{3}\b)"A10 C103 910" 中的 "A10" 和 "910"
(?( name )yes | no )如果 name 或已命名或已编号的捕获组具有匹配,则匹配 yes;否则匹配可选的 no(?< quoted>")?(?(quoted).+?"|\S+\s)"Dogs.jpg "Yiska playing.jpg"" 中的 Dogs.jpg 和 "Yiska playing.jpg"

替换

替换是替换模式中使用的正则表达式。

下表列出了用于替换的字符:

字符描述模式替换模式输入字符串结果字符串
$number替换按组 number 匹配的子字符串。\b(\w+)(\s)(\w+)\b$3$2$1"one two""two one"
${name}替换按命名组 name 匹配的子字符串。\b(?< word1>\w+)(\s)(?< word2>\w+)\b${word2} ${word1}"one two""two one"
$$替换字符"$"。\b(\d+)\s?USD$$$1"103 USD""$103"
$&替换整个匹配项的一个副本。(\$*(\d*(\.+\d+)?){1})**$&"$1.30""**$1.30**"
$`替换匹配前的输入字符串的所有文本。B+$`"AABBCC""AAAACC"
$'替换匹配后的输入字符串的所有文本。B+$'"AABBCC""AACCCC"
$+替换最后捕获的组。B+(C+)$+"AABBCCDD"AACCDD
$_替换整个输入字符串。B+$_"AABBCC""AAAABBCCCC"

杂项构造

下表列出了各种杂项构造:

构造描述实例
(?imnsx-imnsx)在模式中间对诸如不区分大小写这样的选项进行设置或禁用。\bA(?i)b\w+\b 匹配 "ABA Able Act" 中的 "ABA" 和 "Able"
(?#注释)内联注释。该注释在第一个右括号处终止。\bA(?#匹配以A开头的单词)\w+\b
[行尾]该注释以非转义的 # 开头,并继续到行的结尾。(?x)\bA\w+\b#匹配以 A 开头的单词


Regex 类

Regex 类用于表示一个正则表达式。

下表列出了 Regex 类中一些常用的方法:


序号方法 & 描述
1public bool IsMatch( string input ) 
指示 Regex 构造函数中指定的正则表达式是否在指定的输入字符串中找到匹配项。
2public bool IsMatch( string input, int startat ) 
指示 Regex 构造函数中指定的正则表达式是否在指定的输入字符串中找到匹配项,从字符串中指定的开始位置开始。
3public static bool IsMatch( string input, string pattern ) 
指示指定的正则表达式是否在指定的输入字符串中找到匹配项。
4public MatchCollection Matches( string input ) 
在指定的输入字符串中搜索正则表达式的所有匹配项。
5public string Replace( string input, string replacement ) 
在指定的输入字符串中,把所有匹配正则表达式模式的所有匹配的字符串替换为指定的替换字符串。
6public string[] Split( string input ) 
把输入字符串分割为子字符串数组,根据在 Regex 构造函数中指定的正则表达式模式定义的位置进行分割。



RegEx类常用的方法

①静态Match方法

使用静态Match方法,可以得到源中第一个匹配模式的连续子串。

静态的Match方法有2个重载,分别是

</>code

  1. Regex.Match(string input, string pattern);
  2. Regex.Match(string input, string pattern, RegexOptions options);

第一种重载的参数表示:输入、模式


第二种重载的参数表示:输入、模式、RegexOptions枚举的“按位或”组合。

 

RegexOptions枚举的有效值是:

Complied表示编译此模式

CultureInvariant表示不考虑文化背景

ECMAScript表示符合ECMAScript,这个值只能和IgnoreCase、Multiline、Complied连用

ExplicitCapture表示只保存显式命名的组

IgnoreCase表示不区分输入的大小写

IgnorePatternWhitespace表示去掉模式中的非转义空白,并启用由#标记的注释

Multiline表示多行模式,改变元字符^和$的含义,它们可以匹配行的开头和结尾

None表示无设置,此枚举项没有意义

RightToLeft表示从右向左扫描、匹配,这时,静态的Match方法返回从右向左的第一个匹配

Singleline表示单行模式,改变元字符.的意义,它可以匹配换行符

 

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

 

 

②静态的Matches方法

 

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

 

 

③静态的IsMatch方法

 

此方法返回一个bool,重载形式同静态的Matches,若输入中匹配模式,返回true,否则返回false。

可以理解为:IsMatch方法,返回Matches方法返回的集合是否为空。

RegEx类的实例

⑴字符串替换

</>code

  1. //例如我想把如下格式记录中的NAME值修改为WANG
  2. string line = "ADDR=1234;NAME=ZHANG;PHONE=6789";
  3. Regex reg = new Regex("NAME=(.+);");
  4. string modified = reg.Replace(line, "NAME=WANG;");
  5. //修改后的字符串为 ADDR=1234;NAME=WANG;PHONE=6789

⑵字符串匹配

</>code

  1. /例如我想把如下格式记录中的NAME值修改为WANG
  2. string line = "ADDR=1234;NAME=ZHANG;PHONE=6789";
  3. Regex reg = new Regex("NAME=(.+);");
  4. //例如我想提取记录中的NAME值
  5. Match match = reg.Match(line);
  6. string value = match.Groups[1].Value;
  7. Console.WriteLine("value的值为:{0}", value);


⑷解码gps的GPRMC字符串

</>code

  1. //就可以获得经度、纬度值,而以前需要几十行代码。
  2. Regex reg = new Regex(@"^\$GPRMC,[\d\.]*,[A|V],(-?[0-9]*\.?[0-9]+),([NS]*),(-?[0-9]*\.?[0-9]+),([EW]*),.*");

命名空间说明

System.Text.RegularExpressions命名空间的说明

该名称空间包括8个类,1个枚举,1个委托。他们分别是: 

</>code

  1. //Capture: 包含一次匹配的结果;
  2. //CaptureCollection: Capture的序列;
  3. //Group: 一次组记录的结果,由Capture继承而来;
  4. //GroupCollection:表示捕获组的集合
  5. //Match: 一次表达式的匹配结果,由Group继承而来;
  6. //MatchCollection: Match的一个序列;
  7. //MatchEvaluator: 执行替换操作时使用的委托;
  8. //RegexCompilationInfo:提供编译器用于将正则表达式编译为独立程序集的信息
  9. //RegexOptions 提供用于设置正则表达式的枚举值
  10. //Regex类中还包含一些静态的方法:
  11. //Escape: 对字符串中的regex中的转义符进行转义;
  12. //IsMatch: 如果表达式在字符串中匹配,该方法返回一个布尔值;
  13. //Match: 返回Match的实例;
  14. //Matches: 返回一系列的Match的方法;
  15. //Replace: 用替换字符串替换匹配的表达式;
  16. //Split: 返回一系列由表达式决定的字符串;
  17. //Unescape:不对字符串中的转义字符转义。

实例 1

下面的实例匹配了以 'S' 开头的单词:

</>code

  1. using System;using System.Text.RegularExpressions;namespace RegExApplication{
  2.    class Program
  3.    {
  4.       private static void showMatch(string text, string expr)
  5.       {
  6.          Console.WriteLine("The Expression: " + expr);
  7.          MatchCollection mc = Regex.Matches(text, expr);
  8.          foreach (Match m in mc)
  9.          {
  10.             Console.WriteLine(m);
  11.          }
  12.       }
  13.       static void Main(string[] args)
  14.       {
  15.          string str = "A Thousand Splendid Suns";
  16.          Console.WriteLine("Matching words that start with 'S': ");
  17.          showMatch(str, @"\bS\S*");
  18.          Console.ReadKey();
  19.       }
  20.    }}

当上面的代码被编译和执行时,它会产生下列结果:

</>code

  1. Matching words that start with 'S':The Expression: \bS\S*SplendidSuns

实例 2

下面的实例匹配了以 'm' 开头以 'e' 结尾的单词:

</>code

  1. using System;using System.Text.RegularExpressions;namespace RegExApplication{
  2.    class Program
  3.    {
  4.       private static void showMatch(string text, string expr)
  5.       {
  6.          Console.WriteLine("The Expression: " + expr);
  7.          MatchCollection mc = Regex.Matches(text, expr);
  8.          foreach (Match m in mc)
  9.          {
  10.             Console.WriteLine(m);
  11.          }
  12.       }
  13.       static void Main(string[] args)
  14.       {
  15.          string str = "make maze and manage to measure it";
  16.          Console.WriteLine("Matching words start with 'm' and ends with 'e':");
  17.          showMatch(str, @"\bm\S*e\b");
  18.          Console.ReadKey();
  19.       }
  20.    }}

当上面的代码被编译和执行时,它会产生下列结果:

</>code

  1. Matching words start with 'm' and ends with 'e':The Expression: \bm\S*e\b
  2. make
  3. maze
  4. manage
  5. measure

实例 3

下面的实例替换掉多余的空格:

</>code

  1. using System;using System.Text.RegularExpressions;namespace RegExApplication{
  2.    class Program
  3.    {
  4.       static void Main(string[] args)
  5.       {
  6.          string input = "Hello   World   ";
  7.          string pattern = "\\s+";
  8.          string replacement = " ";
  9.          Regex rgx = new Regex(pattern);
  10.          string result = rgx.Replace(input, replacement);
  11.          Console.WriteLine("Original String: {0}", input);
  12.          Console.WriteLine("Replacement String: {0}", result);    
  13.          Console.ReadKey();
  14.       }
  15.    }}

当上面的代码被编译和执行时,它会产生下列结果:

</>code

  1. Original String: Hello   World   Replacement String: Hello World


C#正则常用表达式 

㈠校验数字的表达式

</>code

  1. //数字
  2.             Regex reg = new Regex(@"^[0-9]*$");
  3.             //n位的数字
  4.             Regex reg = new Regex(@"^\d{n}$");
  5.             //至少n位的数字
  6.             Regex reg = new Regex(@"^\d{n,}$");
  7.             //m-n位的数字
  8.             Regex reg = new Regex(@"^\d{m,n}$");
  9.             //零和非零开头的数字
  10.             Regex reg = new Regex(@"^(0|[1-9][0-9]*)$");
  11.             //非零开头的最多带两位小数的数字
  12.             Regex reg = new Regex(@"^([1-9][0-9]*)+(.[0-9]{1,2})?$");
  13.             //带1-2位小数的正数或负数
  14.             Regex reg = new Regex(@"^(\-)?\d+(\.\d{1,2})?$");
  15.             //正数、负数、和小数
  16.             Regex reg = new Regex(@"^(\-|\+)?\d+(\.\d+)?$");
  17.             //有两位小数的正实数
  18.             Regex reg = new Regex(@"^[0-9]+(.[0-9]{2})?$");
  19.             //有1~3位小数的正实数
  20.             Regex reg = new Regex(@"^[0-9]+(.[0-9]{1,3})?$");
  21.             //非零的正整数
  22.             Regex reg = new Regex(@"^[1-9]\d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^\+?[1-9][0-9]*$");
  23.             //非零的负整数
  24.             Regex reg = new Regex(@"^\-[1-9][]0-9″*$ 或 ^-[1-9]\d*$");
  25.             //非负整数
  26.             Regex reg = new Regex(@"^\d+$ 或 ^[1-9]\d*|0$");
  27.             //非正整数
  28.             Regex reg = new Regex(@"^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$");
  29.             //非负浮点数
  30.             Regex reg = new Regex(@"^\d+(\.\d+)?$ 或 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$");
  31.             //非正浮点数
  32.             Regex reg = new Regex(@"^((-\d+(\.\d+)?)|(0+(\.0+)?))$ 或 ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$");
  33.             //正浮点数
  34.             Regex reg = new Regex(@"^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ 或 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$");
  35.             //负浮点数
  36.             Regex reg = new Regex(@"^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ 或 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$");
  37.             //浮点数
  38.             Regex reg = new Regex(@"^(-?\d+)(\.\d+)?$ 或 ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$");

㈡校验字符的表达式

</>code

  1. //汉字
  2.             Regex reg = new Regex(@"^[\u4e00-\u9fa5]{0,}$");
  3.             //英文和数字
  4.             Regex reg = new Regex(@"^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$");
  5.             //长度为3-20的所有字符
  6.             Regex reg = new Regex(@"^.{3,20}$");
  7.             //由26个英文字母组成的字符串
  8.             Regex reg = new Regex(@"^[A-Za-z]+$");
  9.             //由26个大写英文字母组成的字符串
  10.             Regex reg = new Regex(@"^[A-Z]+$");
  11.             //由26个小写英文字母组成的字符串
  12.             Regex reg = new Regex(@"^[a-z]+$");
  13.             //由数字和26个英文字母组成的字符串
  14.             Regex reg = new Regex(@"^[A-Za-z0-9]+$");
  15.             //由数字、26个英文字母或者下划线组成的字符串
  16.             Regex reg = new Regex(@"^\w+$ 或 ^\w{3,20}$");
  17.             //中文、英文、数字包括下划线
  18.             Regex reg = new Regex(@"^[\u4E00-\u9FA5A-Za-z0-9_]+$");
  19.             //中文、英文、数字但不包括下划线等符号
  20.             Regex reg = new Regex(@"^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$");
  21.             //可以输入含有^%&’,;=?$\”等字符
  22.             Regex reg = new Regex(@"[^%&’,;=?$\x22]+");
  23.             //禁止输入含有~的字符
  24.             Regex reg = new Regex(@"[^~\x22]+");

㈢特殊需求表达式

</>code

  1. //Email地址
  2.             Regex reg = new Regex(@"^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$");
  3.             //域名
  4.             Regex reg = new Regex(@"[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?");
  5.             //InternetURL
  6.             Regex reg = new Regex(@"[a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$");
  7.             //手机号码
  8.             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}$");
  9.             //电话号码(“XXX-XXXXXXX”、”XXXX-XXXXXXXX”、”XXX-XXXXXXX”、”XXX-XXXXXXXX”、”XXXXXXX”和”XXXXXXXX)
  10.             Regex reg = new Regex(@"^($$\d{3,4}-)|\d{3.4}-)?\d{7,8}$");
  11.             //国内电话号码(0511-4405222、021-87888822)
  12.             Regex reg = new Regex(@"\d{3}-\d{8}|\d{4}-\d{7}");
  13.             //身份证号(15位、18位数字)
  14.             Regex reg = new Regex(@"^\d{15}|\d{18}$");
  15.             //短身份证号码(数字、字母x结尾)
  16.             Regex reg = new Regex(@"^([0-9]){7,18}(x|X)?$ 或 ^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$");
  17.             //帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线)
  18.             Regex reg = new Regex(@"^[a-zA-Z][a-zA-Z0-9_]{4,15}$");
  19.             //密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线)
  20.             Regex reg = new Regex(@"^[a-zA-Z]\w{5,17}$");
  21.             //强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间)
  22.             Regex reg = new Regex(@"^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$");
  23.             //日期格式
  24.             Regex reg = new Regex(@"^\d{4}-\d{1,2}-\d{1,2}");
  25.             //一年的12个月(01~09和1~12)
  26.             Regex reg = new Regex(@"^(0?[1-9]|1[0-2])$");
  27.             //一个月的31天(01~09和1~31)
  28.             Regex reg = new Regex(@"^((0?[1-9])|((1|2)[0-9])|30|31)$");
  29.             //钱的输入格式:
  30.             //有四种钱的表示形式我们可以接受:”10000.00″ 和 “10,000.00”, 和没有 “分” 的 “10000” 和 “10,000”
  31.             Regex reg = new Regex(@"^[1-9][0-9]*$");
  32.             //这表示任意一个不以0开头的数字,但是,这也意味着一个字符”0″不通过,所以我们采用下面的形式
  33.             Regex reg = new Regex(@"^(0|[1-9][0-9]*)$");
  34.             //一个0或者一个不以0开头的数字.我们还可以允许开头有一个负号
  35.             Regex reg = new Regex(@"^(0|-?[1-9][0-9]*)$");
  36.             //这表示一个0或者一个可能为负的开头不为0的数字.让用户以0开头好了.把负号的也去掉,因为钱总不能是负的吧.下面我们要加的是说明可能的小数部分
  37.             Regex reg = new Regex(@"^[0-9]+(.[0-9]+)?$");
  38.             //必须说明的是,小数点后面至少应该有1位数,所以”10.”是不通过的,但是 “10” 和 “10.2” 是通过的
  39.             Regex reg = new Regex(@"^[0-9]+(.[0-9]{2})?$");
  40.             //这样我们规定小数点后面必须有两位,如果你认为太苛刻了,可以这样
  41.             Regex reg = new Regex(@"^[0-9]+(.[0-9]{1,2})?$");
  42.             //这样就允许用户只写一位小数。下面我们该考虑数字中的逗号了,我们可以这样
  43.             Regex reg = new Regex(@"^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$");
  44.             //1到3个数字,后面跟着任意个 逗号+3个数字,逗号成为可选,而不是必须
  45.             Regex reg = new Regex(@"^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$");
  46.             //备注:这就是最终结果了,别忘了”+”可以用”*”替代。如果你觉得空字符串也可以接受的话(奇怪,为什么?)最后,别忘了在用函数时去掉去掉那个反斜杠,一般的错误都在这里
  47.             //xml文件
  48.             Regex reg = new Regex(@"^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$");
  49.             //中文字符的正则表达式
  50.             Regex reg = new Regex(@"[\u4e00-\u9fa5]");
  51.             //双字节字符
  52.             Regex reg = new Regex(@"[^\x00-\xff] (包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1))");
  53.             //空白行的正则表达式,可用来删除空白行
  54.             Regex reg = new Regex(@"\n\s*\r");
  55.             //HTML标记的正则表达式
  56.             Regex reg = new Regex(@"<(\S*?)[^>]*>.*?</\1>|<.*? />");// (网上流传的版本太糟糕,上面这个也仅仅能部分,对于复杂的嵌套标记依旧无能为力)
  57.             //首尾空白字符的正则表达式
  58.             Regex reg = new Regex(@"^\s*|\s*$或(^\s*)|(\s*$)");// (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式)
  59.             //腾讯QQ号
  60.             Regex reg = new Regex(@"[1-9][0-9]{4,}"); //(腾讯QQ号从10000开始)
  61.             //中国邮政编码
  62.             Regex reg = new Regex(@"[1-9]\d{5}(?!\d)");// (中国邮政编码为6位数字)
  63.             //IP地址
  64.             Regex reg = new Regex(@"\d+\.\d+\.\d+\.\d+");// (提取IP地址时有用)
  65.             //IP地址
  66.             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))");


使用demo

正则的使用可以分为验证方法和匹配方法两种

因上文对正则已经做了比较详细的讲解,故在此不多做赘述,直接贴出使用demo

</>code

  1. public class Validator
  2.         {
  3.             #region 匹配方法
  4.             /// <summary>  
  5.             /// 验证字符串是否匹配正则表达式描述的规则  
  6.             /// </summary>  
  7.             /// <param name="inputStr">待验证的字符串</param>  
  8.             /// <param name="patternStr">正则表达式字符串</param>  
  9.             /// <returns>是否匹配</returns>  
  10.             public static bool IsMatch(string inputStr, string patternStr)
  11.             {
  12.                 return IsMatch(inputStr, patternStr, false, false);
  13.             }
  14.             /// <summary>  
  15.             /// 验证字符串是否匹配正则表达式描述的规则  
  16.             /// </summary>  
  17.             /// <param name="inputStr">待验证的字符串</param>  
  18.             /// <param name="patternStr">正则表达式字符串</param>  
  19.             /// <param name="ifIgnoreCase">匹配时是否不区分大小写</param>  
  20.             /// <returns>是否匹配</returns>  
  21.             public static bool IsMatch(string inputStr, string patternStr, bool ifIgnoreCase)
  22.             {
  23.                 return IsMatch(inputStr, patternStr, ifIgnoreCase, false);
  24.             }
  25.             /// <summary>  
  26.             /// 验证字符串是否匹配正则表达式描述的规则  
  27.             /// </summary>  
  28.             /// <param name="inputStr">待验证的字符串</param>  
  29.             /// <param name="patternStr">正则表达式字符串</param>  
  30.             /// <param name="ifValidateWhiteSpace">是否验证空白字符串</param>  
  31.             /// <returns>是否匹配</returns>  
  32.             public static bool IsMatch(string inputStr, string patternStr, bool ifValidateWhiteSpace)
  33.             {
  34.                 return IsMatch(inputStr, patternStr, false, ifValidateWhiteSpace);
  35.             }
  36.             /// <summary>  
  37.             /// 验证字符串是否匹配正则表达式描述的规则  
  38.             /// </summary>  
  39.             /// <param name="inputStr">待验证的字符串</param>  
  40.             /// <param name="patternStr">正则表达式字符串</param>  
  41.             /// <param name="ifIgnoreCase">匹配时是否不区分大小写</param>  
  42.             /// <param name="ifValidateWhiteSpace">是否验证空白字符串</param>  
  43.             /// <returns>是否匹配</returns>  
  44.             public static bool IsMatch(string inputStr, string patternStr, bool ifIgnoreCase, bool ifValidateWhiteSpace)
  45.             {
  46.                 if (!ifValidateWhiteSpace && string.IsNullOrWhiteSpace(inputStr))//.NET 4.0 新增IsNullOrWhiteSpace 方法,便于对用户做处理
  47.                     return false;//如果不要求验证空白字符串而此时传入的待验证字符串为空白字符串,则不匹配  
  48.                 Regex regex = null;
  49.                 if (ifIgnoreCase)
  50.                     regex = new Regex(patternStr, RegexOptions.IgnoreCase);//指定不区分大小写的匹配  
  51.                 else
  52.                     regex = new Regex(patternStr);
  53.                 return regex.IsMatch(inputStr);
  54.             }
  55.             #endregion
  56.             #region 验证方法
  57.             /// <summary>  
  58.             /// 验证数字(double类型)  
  59.             /// [可以包含负号和小数点]  
  60.             /// </summary>  
  61.             /// <param name="input">待验证的字符串</param>  
  62.             /// <returns>是否匹配</returns>  
  63.             public static bool IsNumber(string input)
  64.             {
  65.                 //string pattern = @"^-?\d+$|^(-?\d+)(\.\d+)?$";  
  66.                 //return IsMatch(input, pattern);  
  67.                 double d = 0;
  68.                 if (double.TryParse(input, out d))
  69.                     return true;
  70.                 else
  71.                     return false;
  72.             }
  73.             /// <summary>  
  74.             /// 验证整数  
  75.             /// </summary>  
  76.             /// <param name="input">待验证的字符串</param>  
  77.             /// <returns>是否匹配</returns>  
  78.             public static bool IsInteger(string input)
  79.             {
  80.                 //string pattern = @"^-?\d+$";  
  81.                 //return IsMatch(input, pattern);  
  82.                 int i = 0;
  83.                 if (int.TryParse(input, out i))
  84.                     return true;
  85.                 else
  86.                     return false;
  87.             }
  88.             /// <summary>  
  89.             /// 验证非负整数  
  90.             /// </summary>  
  91.             /// <param name="input">待验证的字符串</param>  
  92.             /// <returns>是否匹配</returns>  
  93.             public static bool IsIntegerNotNagtive(string input)
  94.             {
  95.                 //string pattern = @"^\d+$";  
  96.                 //return IsMatch(input, pattern);  
  97.                 int i = -1;
  98.                 if (int.TryParse(input, out i) && i >= 0)
  99.                     return true;
  100.                 else
  101.                     return false;
  102.             }
  103.             /// <summary>  
  104.             /// 验证正整数  
  105.             /// </summary>  
  106.             /// <param name="input">待验证的字符串</param>  
  107.             /// <returns>是否匹配</returns>  
  108.             public static bool IsIntegerPositive(string input)
  109.             {
  110.                 //string pattern = @"^[0-9]*[1-9][0-9]*$";  
  111.                 //return IsMatch(input, pattern);  
  112.                 int i = 0;
  113.                 if (int.TryParse(input, out i) && i >= 1)
  114.                     return true;
  115.                 else
  116.                     return false;
  117.             }
  118.             /// <summary>  
  119.             /// 验证小数  
  120.             /// </summary>  
  121.             /// <param name="input">待验证的字符串</param>  
  122.             /// <returns>是否匹配</returns>  
  123.             public static bool IsDecimal(string input)
  124.             {
  125.                 string pattern = @"^([-+]?[1-9]\d*\.\d+|-?0\.\d*[1-9]\d*)$";
  126.                 return IsMatch(input, pattern);
  127.             }
  128.             /// <summary>  
  129.             /// 验证只包含英文字母  
  130.             /// </summary>  
  131.             /// <param name="input">待验证的字符串</param>  
  132.             /// <returns>是否匹配</returns>  
  133.             public static bool IsEnglishCharacter(string input)
  134.             {
  135.                 string pattern = @"^[A-Za-z]+$";
  136.                 return IsMatch(input, pattern);
  137.             }
  138.             /// <summary>  
  139.             /// 验证只包含数字和英文字母  
  140.             /// </summary>  
  141.             /// <param name="input">待验证的字符串</param>  
  142.             /// <returns>是否匹配</returns>  
  143.             public static bool IsIntegerAndEnglishCharacter(string input)
  144.             {
  145.                 string pattern = @"^[0-9A-Za-z]+$";
  146.                 return IsMatch(input, pattern);
  147.             }
  148.             /// <summary>  
  149.             /// 验证只包含汉字  
  150.             /// </summary>  
  151.             /// <param name="input">待验证的字符串</param>  
  152.             /// <returns>是否匹配</returns>  
  153.             public static bool IsChineseCharacter(string input)
  154.             {
  155.                 string pattern = @"^[\u4e00-\u9fa5]+$";
  156.                 return IsMatch(input, pattern);
  157.             }
  158.             /// <summary>  
  159.             /// 验证数字长度范围(数字前端的0计长度)  
  160.             /// [若要验证固定长度,可传入相同的两个长度数值]  
  161.             /// </summary>  
  162.             /// <param name="input">待验证的字符串</param>  
  163.             /// <param name="lengthBegin">长度范围起始值(含)</param>  
  164.             /// <param name="lengthEnd">长度范围结束值(含)</param>  
  165.             /// <returns>是否匹配</returns>  
  166.             public static bool IsIntegerLength(string input, int lengthBegin, int lengthEnd)
  167.             {
  168.                 //string pattern = @"^\d{" + lengthBegin + "," + lengthEnd + "}$";  
  169.                 //return IsMatch(input, pattern);  
  170.                 if (input.Length >= lengthBegin && input.Length <= lengthEnd)
  171.                 {
  172.                     int i;
  173.                     if (int.TryParse(input, out i))
  174.                         return true;
  175.                     else
  176.                         return false;
  177.                 }
  178.                 else
  179.                     return false;
  180.             }
  181.             /// <summary>  
  182.             /// 验证字符串包含内容  
  183.             /// </summary>  
  184.             /// <param name="input">待验证的字符串</param>  
  185.             /// <param name="withEnglishCharacter">是否包含英文字母</param>  
  186.             /// <param name="withNumber">是否包含数字</param>  
  187.             /// <param name="withChineseCharacter">是否包含汉字</param>  
  188.             /// <returns>是否匹配</returns>  
  189.             public static bool IsStringInclude(string input, bool withEnglishCharacter, bool withNumber, bool withChineseCharacter)
  190.             {
  191.                 if (!withEnglishCharacter && !withNumber && !withChineseCharacter)
  192.                     return false;//如果英文字母、数字和汉字都没有,则返回false  
  193.                 StringBuilder patternString = new StringBuilder();
  194.                 patternString.Append("^[");
  195.                 if (withEnglishCharacter)
  196.                     patternString.Append("a-zA-Z");
  197.                 if (withNumber)
  198.                     patternString.Append("0-9");
  199.                 if (withChineseCharacter)
  200.                     patternString.Append(@"\u4E00-\u9FA5");
  201.                 patternString.Append("]+$");
  202.                 return IsMatch(input, patternString.ToString());
  203.             }
  204.             /// <summary>  
  205.             /// 验证字符串长度范围  
  206.             /// [若要验证固定长度,可传入相同的两个长度数值]  
  207.             /// </summary>  
  208.             /// <param name="input">待验证的字符串</param>  
  209.             /// <param name="lengthBegin">长度范围起始值(含)</param>  
  210.             /// <param name="lengthEnd">长度范围结束值(含)</param>  
  211.             /// <returns>是否匹配</returns>  
  212.             public static bool IsStringLength(string input, int lengthBegin, int lengthEnd)
  213.             {
  214.                 //string pattern = @"^.{" + lengthBegin + "," + lengthEnd + "}$";  
  215.                 //return IsMatch(input, pattern);  
  216.                 if (input.Length >= lengthBegin && input.Length <= lengthEnd)
  217.                     return true;
  218.                 else
  219.                     return false;
  220.             }
  221.             /// <summary>  
  222.             /// 验证字符串长度范围(字符串内只包含数字和/或英文字母)  
  223.             /// [若要验证固定长度,可传入相同的两个长度数值]  
  224.             /// </summary>  
  225.             /// <param name="input">待验证的字符串</param>  
  226.             /// <param name="lengthBegin">长度范围起始值(含)</param>  
  227.             /// <param name="lengthEnd">长度范围结束值(含)</param>  
  228.             /// <returns>是否匹配</returns>  
  229.             public static bool IsStringLengthOnlyNumberAndEnglishCharacter(string input, int lengthBegin, int lengthEnd)
  230.             {
  231.                 string pattern = @"^[0-9a-zA-z]{" + lengthBegin + "," + lengthEnd + "}$";
  232.                 return IsMatch(input, pattern);
  233.             }
  234.             /// <summary>  
  235.             /// 验证字符串长度范围  
  236.             /// [若要验证固定长度,可传入相同的两个长度数值]  
  237.             /// </summary>  
  238.             /// <param name="input">待验证的字符串</param>  
  239.             /// <param name="withEnglishCharacter">是否包含英文字母</param>  
  240.             /// <param name="withNumber">是否包含数字</param>  
  241.             /// <param name="withChineseCharacter">是否包含汉字</param>  
  242.             /// <param name="lengthBegin">长度范围起始值(含)</param>  
  243.             /// <param name="lengthEnd">长度范围结束值(含)</param>  
  244.             /// <returns>是否匹配</returns>  
  245.             public static bool IsStringLengthByInclude(string input, bool withEnglishCharacter, bool withNumber, bool withChineseCharacter, int lengthBegin, int lengthEnd)
  246.             {
  247.                 if (!withEnglishCharacter && !withNumber && !withChineseCharacter)
  248.                     return false;//如果英文字母、数字和汉字都没有,则返回false  
  249.                 StringBuilder patternString = new StringBuilder();
  250.                 patternString.Append("^[");
  251.                 if (withEnglishCharacter)
  252.                     patternString.Append("a-zA-Z");
  253.                 if (withNumber)
  254.                     patternString.Append("0-9");
  255.                 if (withChineseCharacter)
  256.                     patternString.Append(@"\u4E00-\u9FA5");
  257.                 patternString.Append("]{" + lengthBegin + "," + lengthEnd + "}$");
  258.                 return IsMatch(input, patternString.ToString());
  259.             }
  260.             /// <summary>  
  261.             /// 验证字符串字节数长度范围  
  262.             /// [若要验证固定长度,可传入相同的两个长度数值;每个汉字为两个字节长度]  
  263.             /// </summary>  
  264.             /// <param name="input">待验证的字符串</param>  
  265.             /// <param name="lengthBegin">长度范围起始值(含)</param>  
  266.             /// <param name="lengthEnd">长度范围结束值(含)</param>  
  267.             /// <returns></returns>  
  268.             public static bool IsStringByteLength(string input, int lengthBegin, int lengthEnd)
  269.             {
  270.                 //int byteLength = Regex.Replace(input, @"[^\x00-\xff]", "ok").Length;  
  271.                 //if (byteLength >= lengthBegin && byteLength <= lengthEnd)  
  272.                 //{  
  273.                 //    return true;  
  274.                 //}  
  275.                 //return false;  
  276.                 int byteLength = Encoding.Default.GetByteCount(input);
  277.                 if (byteLength >= lengthBegin && byteLength <= lengthEnd)
  278.                     return true;
  279.                 else
  280.                     return false;
  281.             }
  282.             /// <summary>  
  283.             /// 验证日期  
  284.             /// </summary>  
  285.             /// <param name="input">待验证的字符串</param>  
  286.             /// <returns>是否匹配</returns>  
  287.             public static bool IsDateTime(string input)
  288.             {
  289.                 DateTime dt;
  290.                 if (DateTime.TryParse(input, out dt))
  291.                     return true;
  292.                 else
  293.                     return false;
  294.             }
  295.             /// <summary>  
  296.             /// 验证固定电话号码  
  297.             /// [3位或4位区号;区号可以用小括号括起来;区号可以省略;区号与本地号间可以用减号或空格隔开;可以有3位数的分机号,分机号前要加减号]  
  298.             /// </summary>  
  299.             /// <param name="input">待验证的字符串</param>  
  300.             /// <returns>是否匹配</returns>  
  301.             public static bool IsTelePhoneNumber(string input)
  302.             {
  303.                 string pattern = @"^(((0\d2|0\d{2})[- ]?)?\d{8}|((0\d3|0\d{3})[- ]?)?\d{7})(-\d{3})?$";
  304.                 return IsMatch(input, pattern);
  305.             }
  306.             /// <summary>  
  307.             /// 验证手机号码  
  308.             /// [可匹配"(+86)013325656352",括号可以省略,+号可以省略,(+86)可以省略,11位手机号前的0可以省略;11位手机号第二位数可以是3、4、5、8中的任意一个]  
  309.             /// </summary>  
  310.             /// <param name="input">待验证的字符串</param>  
  311.             /// <returns>是否匹配</returns>  
  312.             public static bool IsMobilePhoneNumber(string input)
  313.             {
  314.                 string pattern = @"^((\+)?86|((\+)?86)?)0?1[3458]\d{9}$";
  315.                 return IsMatch(input, pattern);
  316.             }
  317.             /// <summary>  
  318.             /// 验证电话号码(可以是固定电话号码或手机号码)  
  319.             /// [固定电话:[3位或4位区号;区号可以用小括号括起来;区号可以省略;区号与本地号间可以用减号或空格隔开;可以有3位数的分机号,分机号前要加减号]]  
  320.             /// [手机号码:[可匹配"(+86)013325656352",括号可以省略,+号可以省略,(+86)可以省略,手机号前的0可以省略;手机号第二位数可以是3、4、5、8中的任意一个]]  
  321.             /// </summary>  
  322.             /// <param name="input">待验证的字符串</param>  
  323.             /// <returns>是否匹配</returns>  
  324.             public static bool IsPhoneNumber(string input)
  325.             {
  326.                 string pattern = @"^((\+)?86|((\+)?86)?)0?1[3458]\d{9}$|^(((0\d2|0\d{2})[- ]?)?\d{8}|((0\d3|0\d{3})[- ]?)?\d{7})(-\d{3})?$";
  327.                 return IsMatch(input, pattern);
  328.             }
  329.             /// <summary>  
  330.             /// 验证邮政编码  
  331.             /// </summary>  
  332.             /// <param name="input">待验证的字符串</param>  
  333.             /// <returns>是否匹配</returns>  
  334.             public static bool IsZipCode(string input)
  335.             {
  336.                 //string pattern = @"^\d{6}$";  
  337.                 //return IsMatch(input, pattern);  
  338.                 if (input.Length != 6)
  339.                     return false;
  340.                 int i;
  341.                 if (int.TryParse(input, out i))
  342.                     return true;
  343.                 else
  344.                     return false;
  345.             }
  346.             /// <summary>  
  347.             /// 验证电子邮箱  
  348.             /// [@字符前可以包含字母、数字、下划线和点号;@字符后可以包含字母、数字、下划线和点号;@字符后至少包含一个点号且点号不能是最后一个字符;最后一个点号后只能是字母或数字]  
  349.             /// </summary>  
  350.             /// <param name="input">待验证的字符串</param>  
  351.             /// <returns>是否匹配</returns>  
  352.             public static bool IsEmail(string input)
  353.             {
  354.                 ////邮箱名以数字或字母开头;邮箱名可由字母、数字、点号、减号、下划线组成;邮箱名(@前的字符)长度为3~18个字符;邮箱名不能以点号、减号或下划线结尾;不能出现连续两个或两个以上的点号、减号。  
  355.                 //string pattern = @"^[a-zA-Z0-9]((?<!(\.\.|--))[a-zA-Z0-9\._-]){1,16}[a-zA-Z0-9]@([0-9a-zA-Z][0-9a-zA-Z-]{0,62}\.)+([0-9a-zA-Z][0-9a-zA-Z-]{0,62})\.?|((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$";  
  356.                 string pattern = @"^([\w-\.]+)@([\w-\.]+)(\.[a-zA-Z0-9]+)$";
  357.                 return IsMatch(input, pattern);
  358.             }
  359.             /// <summary>  
  360.             /// 验证网址(可以匹配IPv4地址但没对IPv4地址进行格式验证;IPv6暂时没做匹配)  
  361.             /// [允许省略"://";可以添加端口号;允许层级;允许传参;域名中至少一个点号且此点号前要有内容]  
  362.             /// </summary>  
  363.             /// <param name="input">待验证的字符串</param>  
  364.             /// <returns>是否匹配</returns>  
  365.             public static bool IsURL(string input)
  366.             {
  367.                 ////每级域名由字母、数字和减号构成(第一个字母不能是减号),不区分大小写,单个域长度不超过63,完整的域名全长不超过256个字符。在DNS系统中,全名是以一个点“.”来结束的,例如“www.nit.edu.cn.”。没有最后的那个点则表示一个相对地址。   
  368.                 ////没有例如"http://"的前缀,没有传参的匹配  
  369.                 //string pattern = @"^([0-9a-zA-Z][0-9a-zA-Z-]{0,62}\.)+([0-9a-zA-Z][0-9a-zA-Z-]{0,62})\.?$";  
  370.                 //string pattern = @"^(((file|gopher|news|nntp|telnet|http|ftp|https|ftps|sftp)://)|(www\.))+(([a-zA-Z0-9\._-]+\.[a-zA-Z]{2,6})|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(/[a-zA-Z0-9\&%_\./-~-]*)?$";  
  371.                 string pattern = @"^([a-zA-Z]+://)?([\w-\.]+)(\.[a-zA-Z0-9]+)(:\d{0,5})?/?([\w-/]*)\.?([a-zA-Z]*)\??(([\w-]*=[\w%]*&?)*)$";
  372.                 return IsMatch(input, pattern);
  373.             }
  374.             /// <summary>  
  375.             /// 验证IPv4地址  
  376.             /// [第一位和最后一位数字不能是0或255;允许用0补位]  
  377.             /// </summary>  
  378.             /// <param name="input">待验证的字符串</param>  
  379.             /// <returns>是否匹配</returns>  
  380.             public static bool IsIPv4(string input)
  381.             {
  382.                 //string pattern = @"^(25[0-4]|2[0-4]\d]|[01]?\d{2}|[1-9])\.(25[0-5]|2[0-4]\d]|[01]?\d?\d)\.(25[0-5]|2[0-4]\d]|[01]?\d?\d)\.(25[0-4]|2[0-4]\d]|[01]?\d{2}|[1-9])$";  
  383.                 //return IsMatch(input, pattern);  
  384.                 string[] IPs = input.Split('.');
  385.                 if (IPs.Length != 4)
  386.                     return false;
  387.                 int n = -1;
  388.                 for (int i = 0; i < IPs.Length; i++)
  389.                 {
  390.                     if (i == 0 || i == 3)
  391.                     {
  392.                         if (int.TryParse(IPs[i], out n) && n > 0 && n < 255)
  393.                             continue;
  394.                         else
  395.                             return false;
  396.                     }
  397.                     else
  398.                     {
  399.                         if (int.TryParse(IPs[i], out n) && n >= 0 && n <= 255)
  400.                             continue;
  401.                         else
  402.                             return false;
  403.                     }
  404.                 }
  405.                 return true;
  406.             }
  407.             /// <summary>  
  408.             /// 验证IPv6地址  
  409.             /// [可用于匹配任何一个合法的IPv6地址]  
  410.             /// </summary>  
  411.             /// <param name="input">待验证的字符串</param>  
  412.             /// <returns>是否匹配</returns>  
  413.             public static bool IsIPv6(string input)
  414.             {
  415.                 string pattern = @"^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$";
  416.                 return IsMatch(input, pattern);
  417.             }
  418.             /// <summary>  
  419.             /// 身份证上数字对应的地址  
  420.             /// </summary>  
  421.             //enum IDAddress  
  422.             //{  
  423.             //    北京 = 11, 天津 = 12, 河北 = 13, 山西 = 14, 内蒙古 = 15, 辽宁 = 21, 吉林 = 22, 黑龙江 = 23, 上海 = 31, 江苏 = 32, 浙江 = 33,  
  424.             //    安徽 = 34, 福建 = 35, 江西 = 36, 山东 = 37, 河南 = 41, 湖北 = 42, 湖南 = 43, 广东 = 44, 广西 = 45, 海南 = 46, 重庆 = 50, 四川 = 51,  
  425.             //    贵州 = 52, 云南 = 53, 西藏 = 54, 陕西 = 61, 甘肃 = 62, 青海 = 63, 宁夏 = 64, 新疆 = 65, 台湾 = 71, 香港 = 81, 澳门 = 82, 国外 = 91  
  426.             //}  
  427.             /// <summary>  
  428.             /// 验证一代身份证号(15位数)  
  429.             /// [长度为15位的数字;匹配对应省份地址;生日能正确匹配]  
  430.             /// </summary>  
  431.             /// <param name="input">待验证的字符串</param>  
  432.             /// <returns>是否匹配</returns>  
  433.             public static bool IsIDCard15(string input)
  434.             {
  435.                 //验证是否可以转换为15位整数  
  436.                 long l = 0;
  437.                 if (!long.TryParse(input, out l) || l.ToString().Length != 15)
  438.                 {
  439.                     return false;
  440.                 }
  441.                 //验证省份是否匹配  
  442.                 //1~6位为地区代码,其中1、2位数为各省级政府的代码,3、4位数为地、市级政府的代码,5、6位数为县、区级政府代码。  
  443.                 string address = "11,12,13,14,15,21,22,23,31,32,33,34,35,36,37,41,42,43,44,45,46,50,51,52,53,54,61,62,63,64,65,71,81,82,91,";
  444.                 if (!address.Contains(input.Remove(2) + ","))
  445.                 {
  446.                     return false;
  447.                 }
  448.                 //验证生日是否匹配  
  449.                 string birthdate = input.Substring(6, 6).Insert(4, "/").Insert(2, "/");
  450.                 DateTime dt;
  451.                 if (!DateTime.TryParse(birthdate, out dt))
  452.                 {
  453.                     return false;
  454.                 }
  455.                 return true;
  456.             }
  457.             /// <summary>  
  458.             /// 验证二代身份证号(18位数,GB11643-1999标准)  
  459.             /// [长度为18位;前17位为数字,最后一位(校验码)可以为大小写x;匹配对应省份地址;生日能正确匹配;校验码能正确匹配]  
  460.             /// </summary>  
  461.             /// <param name="input">待验证的字符串</param>  
  462.             /// <returns>是否匹配</returns>  
  463.             public static bool IsIDCard18(string input)
  464.             {
  465.                 //验证是否可以转换为正确的整数  
  466.                 long l = 0;
  467.                 if (!long.TryParse(input.Remove(17), out l) || l.ToString().Length != 17 || !long.TryParse(input.Replace('x', '0').Replace('X', '0'), out l))
  468.                 {
  469.                     return false;
  470.                 }
  471.                 //验证省份是否匹配  
  472.                 //1~6位为地区代码,其中1、2位数为各省级政府的代码,3、4位数为地、市级政府的代码,5、6位数为县、区级政府代码。  
  473.                 string address = "11,12,13,14,15,21,22,23,31,32,33,34,35,36,37,41,42,43,44,45,46,50,51,52,53,54,61,62,63,64,65,71,81,82,91,";
  474.                 if (!address.Contains(input.Remove(2) + ","))
  475.                 {
  476.                     return false;
  477.                 }
  478.                 //验证生日是否匹配  
  479.                 string birthdate = input.Substring(6, 8).Insert(6, "/").Insert(4, "/");
  480.                 DateTime dt;
  481.                 if (!DateTime.TryParse(birthdate, out dt))
  482.                 {
  483.                     return false;
  484.                 }
  485.                 //校验码验证  
  486.                 //校验码:  
  487.                 //(1)十七位数字本体码加权求和公式   
  488.                 //S = Sum(Ai * Wi), i = 0, ... , 16 ,先对前17位数字的权求和   
  489.                 //Ai:表示第i位置上的身份证号码数字值   
  490.                 //Wi:表示第i位置上的加权因子   
  491.                 //Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2   
  492.                 //(2)计算模   
  493.                 //Y = mod(S, 11)   
  494.                 //(3)通过模得到对应的校验码   
  495.                 //Y: 0 1 2 3 4 5 6 7 8 9 10   
  496.                 //校验码: 1 0 X 9 8 7 6 5 4 3 2   
  497.                 string[] arrVarifyCode = ("1,0,x,9,8,7,6,5,4,3,2").Split(',');
  498.                 string[] Wi = ("7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2").Split(',');
  499.                 char[] Ai = input.Remove(17).ToCharArray();
  500.                 int sum = 0;
  501.                 for (int i = 0; i < 17; i++)
  502.                 {
  503.                     sum += int.Parse(Wi[i]) * int.Parse(Ai[i].ToString());
  504.                 }
  505.                 int y = -1;
  506.                 Math.DivRem(sum, 11, out y);
  507.                 if (arrVarifyCode[y] != input.Substring(17, 1).ToLower())
  508.                 {
  509.                     return false;
  510.                 }
  511.                 return true;
  512.             }
  513.             /// <summary>  
  514.             /// 验证身份证号(不区分一二代身份证号)  
  515.             /// </summary>  
  516.             /// <param name="input">待验证的字符串</param>  
  517.             /// <returns>是否匹配</returns>  
  518.             public static bool IsIDCard(string input)
  519.             {
  520.                 if (input.Length == 18)
  521.                     return IsIDCard18(input);
  522.                 else if (input.Length == 15)
  523.                     return IsIDCard15(input);
  524.                 else
  525.                     return false;
  526.             }
  527.             /// <summary>  
  528.             /// 验证经度  
  529.             /// </summary>  
  530.             /// <param name="input">待验证的字符串</param>  
  531.             /// <returns>是否匹配</returns>  
  532.             public static bool IsLongitude(string input)
  533.             {
  534.                 ////范围为-180~180,小数位数必须是1到5位  
  535.                 //string pattern = @"^[-\+]?((1[0-7]\d{1}|0?\d{1,2})\.\d{1,5}|180\.0{1,5})$";  
  536.                 //return IsMatch(input, pattern);  
  537.                 float lon;
  538.                 if (float.TryParse(input, out lon) && lon >= -180 && lon <= 180)
  539.                     return true;
  540.                 else
  541.                     return false;
  542.             }
  543.             /// <summary>  
  544.             /// 验证纬度  
  545.             /// </summary>  
  546.             /// <param name="input">待验证的字符串</param>  
  547.             /// <returns>是否匹配</returns>  
  548.             public static bool IsLatitude(string input)
  549.             {
  550.                 ////范围为-90~90,小数位数必须是1到5位  
  551.                 //string pattern = @"^[-\+]?([0-8]?\d{1}\.\d{1,5}|90\.0{1,5})$";  
  552.                 //return IsMatch(input, pattern);  
  553.                 float lat;
  554.                 if (float.TryParse(input, out lat) && lat >= -90 && lat <= 90)
  555.                     return true;
  556.                 else
  557.                     return false;
  558.             }
  559.             #endregion
  560.         }

贪婪与懒惰


</>code

  1. RegexStr = =RegexStr = =, f, m2.ToString());


显示结果:

从上面的例子中我们不难看出贪婪与懒惰的区别,他们的名子取的都很形象。

贪婪匹配:匹配尽可能多的字符。

懒惰匹配:匹配尽可能少的字符。 

Split 拆分字符串


</>code

  1. string SplitInputStr = "1xxxxx.2ooooo.3eeee.4kkkkkk.";
  2. RegexStr = @"\d";
  3. Regex spl_regex = new Regex(RegexStr);string[] str = spl_regex.Split(SplitInputStr);foreach (string item in str)
  4. {
  5.     Console.WriteLine(item);
  6. }


显示结果:

根据数字截取字符串。


Replace 替换字符串

用户在输入信息时偶尔会包含一些敏感词,这时我们需要替换这个敏感词。

</>code

  1. string PageInputStr = "靠.TMMD,今天真不爽....";
  2. RegexStr = @"靠|TMMD|妈的";
  3. Regex rep_regex = new Regex(RegexStr);
  4. Console.WriteLine("用户输入信息:{0}", PageInputStr);
  5. Console.WriteLine("页面显示信息:{0}", rep_regex.Replace(PageInputStr, "***"));

显示结果:

对一些敏感词直接替换成***代替。


获得页面中A标签中href值


</>code

  1. string PageInfo = @"<hteml>
  2.                         <div id=""div1"">
  3.                             <a href=""http://www.baidu.con"" target=""_blank"">百度</a>
  4.                             <a href=""http://www.taobao.con"" target=""_blank"">淘宝</a>
  5.                             <a href=""http://www.cnblogs.com"" target=""_blank"">博客园</a>
  6.                             <a href=""http://www.google.con"" target=""_blank"">google</a>
  7.                         </div>
  8.                         <div id=""div2"">
  9.                             <a href=""/zufang/"">整租</a>
  10.                             <a href=""/hezu/"">合租</a>
  11.                             <a href=""/qiuzu/"">求租</a>
  12.                             <a href=""/ershoufang/"">二手房</a>
  13.                             <a href=""/shangpucz/"">商铺出租</a>
  14.                         </div>
  15.                     </hteml>";
  16. RegexStr = @"<a[^>]+href=""(?<href>[\S]+?)""[^>]*>(?<text>[\S]+?)</a>";
  17. MatchCollection mc = Regex.Matches(PageInfo, RegexStr);foreach (Match item in mc)
  18. {
  19.     Console.WriteLine("href:{0}--->text:{1}",item.Groups["href"].ToString(),item.Groups["text"].ToString());
  20. }


显示结果:


(?<name>exp) 分组取名

当我们匹配分组信息过多后,在某种场合只需取当中某几组信息。这时我们可以对分组取名。通过分组名称来快速提取对应信息。

</>code

  1. string Resume = "基本信息姓名:CK|求职意向:.NET软件工程师|性别:男|学历:本专|出生日期:1988-08-08|户籍:湖北.孝感|E - Mail:9245162@qq.com|手机:15000000000";
  2. RegexStr = @"姓名:(?<name>[\S]+)\|\S+性别:(?<sex>[\S]{1})\|学历:(?<xueli>[\S]{1,10})\|出生日期:(?<Birth>[\S]{10})\|[\s\S]+手机:(?<phone>[\d]{11})";
  3. Match matc = Regex.Match(Resume, RegexStr);
  4. Console.WriteLine("姓名:{0},手机号:{1}", matc.Groups["name"].ToString(), matc.Groups["phone"].ToString());

显示结果:

通过(?<name>exp)可以很轻易为分组取名。然后通过Groups["name"]取得分组值。


如对本文有疑问,请提交到交流论坛,广大热心网友会为你解答!! 点击进入论坛

发表评论 (864人查看0条评论)
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
昵称:
最新评论
------分隔线----------------------------

快速入口

· 365软件
· 杰创官网
· 建站工具
· 网站大全

其它栏目

· 建站教程
· 365学习

业务咨询

· 技术支持
· 服务时间:9:00-18:00
365建站网二维码

Powered by 365建站网 RSS地图 HTML地图

copyright © 2013-2024 版权所有 鄂ICP备17013400号