文章导读

正则表达式的本质是使用一系列特殊字符模式,来表示某一类字符串。正则表达式无疑是处理文本最有力的工具,而.NET提供的Regex类实现了验证正则表达式的方法。Regex 类表示不可变(只读)的正则表达式。它还包含各种静态方法,允许在不显式创建其他类的实例的情况下使用其他正则表达式类。

基础梳理

说明:

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

RegEx类常用的方法

①静态Match方法
 
使用静态Match方法,可以得到源中第一个匹配模式的连续子串。
 
静态的Match方法有2个重载,分别是
Regex.Match(string input, string pattern);
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类的实例

⑴字符串替换

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

⑵字符串匹配

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

⑷解码gps的GPRMC字符串

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

命名空间说明

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

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

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

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}$");
//零和非零开头的数字
Regex reg = new Regex(@"^(0|[1-9][0-9]*)$");
//非零开头的最多带两位小数的数字
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*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^\+?[1-9][0-9]*$");
//非零的负整数
Regex reg = new Regex(@"^\-[1-9][]0-9″*$ 或 ^-[1-9]\d*$");
//非负整数
Regex reg = new Regex(@"^\d+$ 或 ^[1-9]\d*|0$");
//非正整数
Regex reg = new Regex(@"^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$");
//非负浮点数
Regex reg = new Regex(@"^\d+(\.\d+)?$ 或 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$");
//非正浮点数
Regex reg = new Regex(@"^((-\d+(\.\d+)?)|(0+(\.0+)?))$ 或 ^(-([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*$ 或 ^(([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*)$ 或 ^(-(([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+)?$ 或 ^-?([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]+$ 或 ^[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+$ 或 ^\w{3,20}$");
//中文、英文、数字包括下划线
Regex reg = new Regex(@"^[\u4E00-\u9FA5A-Za-z0-9_]+$");
//中文、英文、数字但不包括下划线等符号
Regex reg = new Regex(@"^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\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]* 或 ^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}$");
//电话号码(“XXX-XXXXXXX”、”XXXX-XXXXXXXX”、”XXX-XXXXXXX”、”XXX-XXXXXXXX”、”XXXXXXX”和”XXXXXXXX)
Regex reg = new Regex(@"^($$\d{3,4}-)|\d{3.4}-)?\d{7,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}$");
//短身份证号码(数字、字母x结尾)
Regex reg = new Regex(@"^([0-9]){7,18}(x|X)?$ 或 ^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$");
//帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线)
Regex reg = new Regex(@"^[a-zA-Z][a-zA-Z0-9_]{4,15}$");
//密码(以字母开头,长度在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}$");
//日期格式
Regex reg = new Regex(@"^\d{4}-\d{1,2}-\d{1,2}");
//一年的12个月(01~09和1~12)
Regex reg = new Regex(@"^(0?[1-9]|1[0-2])$");
//一个月的31天(01~09和1~31)
Regex reg = new Regex(@"^((0?[1-9])|((1|2)[0-9])|30|31)$");
//钱的输入格式:
//有四种钱的表示形式我们可以接受:”10000.00″ 和 “10,000.00”, 和没有 “分” 的 “10000” 和 “10,000”
Regex reg = new Regex(@"^[1-9][0-9]*$");
//这表示任意一个不以0开头的数字,但是,这也意味着一个字符”0″不通过,所以我们采用下面的形式
Regex reg = new Regex(@"^(0|[1-9][0-9]*)$");
//一个0或者一个不以0开头的数字.我们还可以允许开头有一个负号
Regex reg = new Regex(@"^(0|-?[1-9][0-9]*)$");
//这表示一个0或者一个可能为负的开头不为0的数字.让用户以0开头好了.把负号的也去掉,因为钱总不能是负的吧.下面我们要加的是说明可能的小数部分
Regex reg = new Regex(@"^[0-9]+(.[0-9]+)?$");
//必须说明的是,小数点后面至少应该有1位数,所以”10.”是不通过的,但是 “10” 和 “10.2” 是通过的
Regex reg = new Regex(@"^[0-9]+(.[0-9]{2})?$");
//这样我们规定小数点后面必须有两位,如果你认为太苛刻了,可以这样
Regex reg = new Regex(@"^[0-9]+(.[0-9]{1,2})?$");
//这样就允许用户只写一位小数。下面我们该考虑数字中的逗号了,我们可以这样
Regex reg = new Regex(@"^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$");
//1到3个数字,后面跟着任意个 逗号+3个数字,逗号成为可选,而不是必须
Regex reg = new Regex(@"^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$");
//备注:这就是最终结果了,别忘了”+”可以用”*”替代。如果你觉得空字符串也可以接受的话(奇怪,为什么?)最后,别忘了在用函数时去掉去掉那个反斜杠,一般的错误都在这里
//xml文件
Regex reg = new Regex(@"^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$");
//中文字符的正则表达式
Regex reg = new Regex(@"[\u4e00-\u9fa5]");
//双字节字符
Regex reg = new Regex(@"[^\x00-\xff] (包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1))");
//空白行的正则表达式,可用来删除空白行
Regex reg = new Regex(@"\n\s*\r");
//HTML标记的正则表达式
Regex reg = new Regex(@"<(\S*?)[^>]*>.*?</\1>|<.*? />");// (网上流传的版本太糟糕,上面这个也仅仅能部分,对于复杂的嵌套标记依旧无能为力)
//首尾空白字符的正则表达式
Regex reg = new Regex(@"^\s*|\s*$或(^\s*)|(\s*$)");// (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式)
//腾讯QQ号
Regex reg = new Regex(@"[1-9][0-9]{4,}"); //(腾讯QQ号从10000开始)
//中国邮政编码
Regex reg = new Regex(@"[1-9]\d{5}(?!\d)");// (中国邮政编码为6位数字)
//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))");

使用demo

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

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

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

C# 正则表达式大全(转载)的更多相关文章

  1. (转载)常用正则表达式大全!(例如:匹配中文、匹配html)

    正则匹配java注意点: 如果加 ^[\n]* 表示替换遇到 \n 的前后内容,如果加[\n]表示替换\n本处内容 原文地址:http://blog.csdn.net/dl020840504/arti ...

  2. JavaScript 表单验证正则表达式大全

    JavaScript 表单验证正则表达式大全[转载] 匹配中文字符的正则表达式: [u4e00-u9fa5] 评注:匹配中文还真是个头疼的事,有了这个表达式就好办了 匹配双字节字符(包括汉字在内):[ ...

  3. 【JS】javascript 正则表达式 大全 总结

    javascript 正则表达式 大全 总结 参考整理了一些javascript正则表达式 目的一:自我复习归纳总结 目的二:共享方便大家搜索 微信:wixf150 验证数字:^[0-9]*$ 验证n ...

  4. JS正则表达式大全

    转自:http://wenku.baidu.com/link?url=3y930kC7F6D3wQdMjQ3fVDmiA9Wfebs_QK0UB3N3mFaEoKg4ytZORPopxufeYA6si ...

  5. CSS颜色代码 颜色值 颜色名字大全(转载)

    CSS颜色代码 颜色值 颜色名字大全 转载处http://flyjj.com/css-colour-code.html 颜色值 CSS 颜色使用组合了红绿蓝颜色值 (RGB) 的十六进制 (hex) ...

  6. JS正则表达式大全(整理详细且实用)

    JS正则表达式大全(整理详细且实用).需要的朋友可以过来参考下,希望对大家有所帮助!! 正则表达式中的特殊字符 字符 含意 \ 做为转意,即通常在"\"后面的字符不按原来意义解释, ...

  7. JavaScript验证正则表达式大全

    JavaScript验证正则表达式大全,搜集最全的JavaScript验证正则表达式,开始查看吧,这里的都是正则表达式的例子,具体和函数结合的使用方法,还请查看下篇文章<JavaScript使用 ...

  8. PHP中常用正则表达式大全

    常用正则表达式大全!(例如:匹配中文.匹配html) 匹配中文字符的正则表达式: [u4e00-u9fa5]    评注:匹配中文还真是个头疼的事,有了这个表达式就好办了 匹配双字节字符(包括汉字在内 ...

  9. 常用js正则表达式大全

    常用js正则表达式大全.一.校验数字的js正则表达式 1 数字:^[0-9]*$ 2 n位的数字:^\d{n}$ 3 至少n位的数字:^\d{n,}$ 4 m-n位的数字:^\d{m,n}$ 5 零和 ...

随机推荐

  1. MongoDB_基本操作

    数据库操作 增加数据库 use db1 #如果数据库不存在,则创建数据库,否则切换到指定数据库 查询数据库 show dbs #可以看到,我们刚创建的数据库db1并不在数据库的列表中,要显示它我们需要 ...

  2. URLLib库使用

    Date: 2019-06-19 Author: Sun urllib ​ 在Python 3以后的版本中,urllib2这个模块已经不单独存在(也就是说当你import urllib2时,系统提示你 ...

  3. DB2解决死锁

    方法一.查看db2diag.log文件 找到DeadLock or Lock timeout搜索 死锁或锁超时信息db2 force application(句柄ID)直接结束进程即可. 方法二.DB ...

  4. 转载:移动端自适应:flexible.js可伸缩布局使用

    阿里团队开源的一个库.flexible.js,主要是实现在各种不同的移动端界面实现一稿搞定所有的设备兼容自适应问题. 实现方法: 通过JS来调整html的字体大小,而在页面中的制作稿则统一使用rem这 ...

  5. 【模板】 非旋转treap

    模板:luogu P3369 [模板]普通平衡树 code: #include <cstdio> #include <cstdlib> const int MAX_N=1000 ...

  6. 《黑白团团队》第八次团队作业:Alpha冲刺 第五天

    项目 内容 作业课程地址 任课教师首页链接 作业要求 团队项目 填写团队名称 黑白团团队 填写具体目标 认真负责,完成项目 团队项目Github仓库地址链接. 第五天 日期:2019/6/19 成员 ...

  7. asp.net mvc--传值-前台->后台

    前端传值->后端 一.Model Binding 方式 前台 @model ADMgr.Web.Models.ListModel 后台 [HttpPost] public ActionResul ...

  8. [Performance] Optimize Paint and Composite for the website

    "Paint" is one of the most preference killer, it can easily cost more than 60fps, and once ...

  9. Android开发之——编码规范

    1. 前言 这份文档参考了 Google Java 编程风格规范和 Google 官方 Android 编码风格规范.该文档仅供参考,只要形成一个统一的风格,见量知其意就可. 2. 源文件基础 2.1 ...

  10. 婚礼上的谎言(C++实现)

    #include<iostream> using namespace std; void main(void) { int a,b,c; char DD,EE,FF; for (a=1;a ...