這是
很早以前寫的一個正則表達式驗證工具類,包含了一些常見的校驗和支持自定義的正則表達式匹配,可以選擇完全匹配,也可以獲取所有匹配項。曾用它仿造Eclispe下的正則表達式插件寫過一個工具。因爲最近突然有幾個朋友都在問這方面的問題,乾脆就把代碼貼出來好了。
- using System;
- using System.Collections;
- using System.Text.RegularExpressions;
- namespace Xrinehart.Framework.Common.Validate
- {
- /// <summary>
-
-
- public class RegularMatch
- {
- private string _String;
- private bool _IsEntirety;
- /// <summary>
-
-
- public enum Operation
- {
- Byte, SByte, Int16, Int32, Int64, Single, Double, Boolean, Char, Decimal, DateTime, Date, Time,
- EMail, URL, ChinaPhone, ChineseWord, ChinesePostalCode, Number, StringModel_01, StringModel_02, WideWord, NarrowWord, IPAddress,
- ChineseMobile, ChineseID
- };
- public RegularMatch() { }
- 用於判斷字符串是否是對應類型(默認爲包含匹配)#region 用於判斷字符串是否是對應類型(默認爲包含匹配)
- public bool IsAccordType(string strVerifyString, Operation op)
- {
- return IsAccordType(strVerifyString, op, false);
- }
- #endregion
- 用於判斷字符串是否是對應類型(或是否包含對應類型的字符)#region 用於判斷字符串是否是對應類型(或是否包含對應類型的字符)
- /// <summary>
-
-
-
-
-
-
- public bool IsAccordType(string strVerifyString, Operation op, bool IsEntirety)
- {
- _String = strVerifyString;
- _IsEntirety = IsEntirety;
- switch (op)
- {
- case Operation.Byte:
- {
- return IsByte();
- }
- case Operation.SByte:
- {
- return IsSByte();
- }
- case Operation.Int16:
- {
- return IsInt16();
- }
- case Operation.Int32:
- {
- return IsInt32();
- }
- case Operation.Int64:
- {
- return IsInt64();
- }
- case Operation.Single:
- {
- return IsSingle();
- }
- case Operation.Double:
- {
- return IsDouble();
- }
- case Operation.Boolean:
- {
- return IsBoolean();
- }
- case Operation.Char:
- {
- return IsChar();
- }
- case Operation.Decimal:
- {
- return IsDecimal();
- }
- case Operation.DateTime:
- {
- return IsDateTime();
- }
- case Operation.Date:
- {
- return IsDate();
- }
- case Operation.Time:
- {
- return IsTime();
- }
- case Operation.IPAddress:
- {
- return IsIPAddress();
- }
- case Operation.ChinaPhone:
- {
- return IsChinaPhone();
- }
- case Operation.ChinesePostalCode:
- {
- return IsChinesePostalCode();
- }
- case Operation.ChineseMobile:
- {
- return IsChineseMobile();
- }
- case Operation.EMail:
- {
- return IsEmail();
- }
- case Operation.URL:
- {
- return IsURL();
- }
- case Operation.ChineseWord:
- {
- return IsChineseWord();
- }
- case Operation.Number:
- {
- return IsNumber();
- }
- case Operation.StringModel_01:
- {
- return IsStringModel_01();
- }
- case Operation.StringModel_02:
- {
- return IsStringModel_02();
- }
- case Operation.WideWord:
- {
- return IsWideWord();
- }
- case Operation.NarrowWord:
- {
- return IsNarrowWord();
- }
- case Operation.ChineseID:
- {
- return IsChineseID();
- }
- default:
- {
- return false;
- }
- }
- }
- #endregion
- 具體驗證方法#region 具體驗證方法
- 是否Byte類型(8 位的無符號整數): 0 和 255 之間的無符號整數#region 是否Byte類型(8 位的無符號整數): 0 和 255 之間的無符號整數
- /// <summary>
-
-
-
- protected bool IsByte()
- {
- try
- {
- Byte.Parse(_String);
- }
- catch
- {
- return false;
- }
- return true;
- }
- #endregion
- 是否SByte類型(8 位的有符號整數): -128 到 +127 之間的整數#region 是否SByte類型(8 位的有符號整數): -128 到 +127 之間的整數
- /// <summary>
-
-
-
- protected bool IsSByte()
- {
- try
- {
- SByte.Parse(_String);
- }
- catch
- {
- return false;
- }
- return true;
- }
- #endregion
- 是否Int16類型(16 位的有符號整數): -32768 到 +32767 之間的有符號整數#region 是否Int16類型(16 位的有符號整數): -32768 到 +32767 之間的有符號整數
- /// <summary>
-
-
-
- protected bool IsInt16()
- {
- try
- {
- Int16.Parse(_String);
- }
- catch
- {
- return false;
- }
- return true;
- }
- #endregion
- 是否Int32類型(32 位的有符號整數):-2,147,483,648 到 +2,147,483,647 之間的有符號整數#region 是否Int32類型(32 位的有符號整數):-2,147,483,648 到 +2,147,483,647 之間的有符號整數
- /// <summary>
-
-
-
- protected bool IsInt32()
- {
- try
- {
- Int32.Parse(_String);
- }
- catch
- {
- return false;
- }
- return true;
- }
- #endregion
- 是否Int64類型(64 位的有符號整數): -9,223,372,036,854,775,808 到 +9,223,372,036,854,775,807 之間的整數#region 是否Int64類型(64 位的有符號整數): -9,223,372,036,854,775,808 到 +9,223,372,036,854,775,807 之間的整數
- /// <summary>
-
-
-
- protected bool IsInt64()
- {
- try
- {
- Int64.Parse(_String);
- }
- catch
- {
- return false;
- }
- return true;
- }
- #endregion
- 是否Single類型(單精度(32 位)浮點數字): -3.402823e38 和 +3.402823e38 之間的單精度 32 位數字#region 是否Single類型(單精度(32 位)浮點數字): -3.402823e38 和 +3.402823e38 之間的單精度 32 位數字
- /// <summary>
-
-
-
- protected bool IsSingle()
- {
- try
- {
- Single.Parse(_String);
- }
- catch
- {
- return false;
- }
- return true;
- }
- #endregion
- 是否Double類型(單精度(64 位)浮點數字): -1.79769313486232e308 和 +1.79769313486232e308 之間的雙精度 64 位數字#region 是否Double類型(單精度(64 位)浮點數字): -1.79769313486232e308 和 +1.79769313486232e308 之間的雙精度 64 位數字
- /// <summary>
-
-
-
- protected bool IsDouble()
- {
- try
- {
- Double.Parse(_String);
- }
- catch
- {
- return false;
- }
- return true;
- }
- #endregion
- 是否Boolean類型(布爾值):true 或 false#region 是否Boolean類型(布爾值):true 或 false
- /// <summary>
-
-
-
- protected bool IsBoolean()
- {
- try
- {
- Boolean.Parse(_String);
- }
- catch
- {
- return false;
- }
- return true;
- }
- #endregion
- 是否Char類型(Unicode(16 位)字符):該 16 位數字的值範圍爲從十六進制值 0x0000 到 0xFFFF#region 是否Char類型(Unicode(16 位)字符):該 16 位數字的值範圍爲從十六進制值 0x0000 到 0xFFFF
- /// <summary>
-
-
-
- protected bool IsChar()
- {
- try
- {
- Char.Parse(_String);
- }
- catch
- {
- return false;
- }
- return true;
- }
- #endregion
- 是否Char類型(96 位十進制值):從正 79,228,162,514,264,337,593,543,950,335 到負 79,228,162,514,264,337,593,543,950,335 之間的十進制數#region 是否Char類型(96 位十進制值):從正 79,228,162,514,264,337,593,543,950,335 到負 79,228,162,514,264,337,593,543,950,335 之間的十進制數
- /// <summary>
-
-
-
- protected bool IsDecimal()
- {
- try
- {
- Decimal.Parse(_String);
- }
- catch
- {
- return false;
- }
- return true;
- }
- #endregion
- 是否DateTime類型(表示時間上的一刻): 範圍在公元(基督紀元)0001 年 1 月 1 日午夜 12:00:00 到公元 (C.E.) 9999 年 12 月 31 日晚上 11:59:59 之間的日期和時間#region 是否DateTime類型(表示時間上的一刻): 範圍在公元(基督紀元)0001 年 1 月 1 日午夜 12:00:00 到公元 (C.E.) 9999 年 12 月 31 日晚上 11:59:59 之間的日期和時間
- /// <summary>
-
-
-
- protected bool IsDateTime()
- {
- try
- {
- DateTime.Parse(_String);
- }
- catch
- {
- return false;
- }
- return true;
- }
- #endregion
- 是否Date類型(表示時間的日期部分): 範圍在公元(基督紀元)0001 年 1 月 1 日 到公元 (C.E.) 9999 年 12 月 31 日之間的日期#region 是否Date類型(表示時間的日期部分): 範圍在公元(基督紀元)0001 年 1 月 1 日 到公元 (C.E.) 9999 年 12 月 31 日之間的日期
- /// <summary>
-
-
-
- protected bool IsDate()
- {
- DateTime Value;
- try
- {
- Value = DateTime.Parse(_String);
- }
- catch
- {
- return false;
- }
- if (Value.Date.ToString() == _String)
- {
- return true;
- }
- else
- {
- return false;
- }
- }
- #endregion
- 是否Time類型(表示時間部分HHMMSS): 範圍在夜 12:00:00 到晚上 11:59:59 之間的時間#region 是否Time類型(表示時間部分HHMMSS): 範圍在夜 12:00:00 到晚上 11:59:59 之間的時間
- /// <summary>
-
-
-
- protected bool IsTime()
- {
- DateTime Value;
- try
- {
- Value = DateTime.Parse(_String);
- }
- catch
- {
- return false;
- }
- if (Value.Year == 1 && Value.Month == 1 && Value.Day == 1)
- {
- return true;
- }
- else
- {
- return false;
- }
- }
- #endregion
- 是否IPAddress類型(IPv4 的情況下使用以點分隔的四部分表示法格式表示,IPv6 的情況下使用冒號與十六進制格式表示)#region 是否IPAddress類型(IPv4 的情況下使用以點分隔的四部分表示法格式表示,IPv6 的情況下使用冒號與十六進制格式表示)
- /// <summary>
-
-
-
- protected bool IsIPAddress()
- {
- try
- {
- System.Net.IPAddress.Parse(_String);
- }
- catch
- {
- return false;
- }
- return true;
- }
- #endregion
- 是否中國電話號碼類型(XXX/XXXX-XXXXXXX/XXXXXXXX (/d{3,4})-?/d{7,8}):判斷是否是(區號:3或4位)-(電話號碼:7或8位)#region 是否中國電話號碼類型(XXX/XXXX-XXXXXXX/XXXXXXXX (/d{3,4})-?/d{7,8}):判斷是否是(區號:3或4位)-(電話號碼:7或8位)
- /// <summary>
-
-
-
- protected bool IsChinaPhone()
- {
- ArrayList aryResult = new ArrayList();
- return CommRegularMatch(_String, @"(/d{3,4})-?/d{7,8}", RegexOptions.None, ref aryResult, _IsEntirety);
- }
- #endregion
- 是否中國郵政編碼(6位數字 /d{6})#region 是否中國郵政編碼(6位數字 /d{6})
- /// <summary>
-
-
-
- protected bool IsChinesePostalCode()
- {
- ArrayList aryResult = new ArrayList();
- return CommRegularMatch(_String, @"/d{6}", RegexOptions.None, ref aryResult, _IsEntirety);
- }
- #endregion
- 是否中國移動電話號碼(13開頭的總11位數字 13/d{9})#region 是否中國移動電話號碼(13開頭的總11位數字 13/d{9})
- /// <summary>
-
-
-
- protected bool IsChineseMobile()
- {
- ArrayList aryResult = new ArrayList();
- return CommRegularMatch(_String, @"13/d{9}", RegexOptions.None, ref aryResult, _IsEntirety);
- }
- #endregion
- 是否EMail類型([email protected] /w+([-+.]/w+)*@/w+([-.]/w+)*/./w+([-.]/w+)*)#region 是否EMail類型([email protected] /w+([-+.]/w+)*@/w+([-.]/w+)*/./w+([-.]/w+)*)
- /// <summary>
-
-
-
- protected bool IsEmail()
- {
- ArrayList aryResult = new ArrayList();
- return CommRegularMatch(_String, @"/w+([-+.]/w+)*@/w+([-.]/w+)*/./w+([-.]/w+)*", RegexOptions.None, ref aryResult, _IsEntirety);
- }
- #endregion
- 是否Internet URL地址類型(http:
- /// <summary>
-
-
-
- protected bool IsURL()
- {
- ArrayList aryResult = new ArrayList();
- return CommRegularMatch(_String, @"http://([/w-]+/.)+[/w-]+(/[/w- ./?%&=]*)?", RegexOptions.None, ref aryResult, _IsEntirety);
- }
- #endregion
- 是否中文字符([/u4e00-/u9fa5])#region 是否中文字符([/u4e00-/u9fa5])
- /// <summary>
-
-
-
- protected bool IsChineseWord()
- {
- ArrayList aryResult = new ArrayList();
- return CommRegularMatch(_String, @"[/u4e00-/u9fa5]", RegexOptions.None, ref aryResult, _IsEntirety);
- }
- #endregion
- 是否是數字(0到9的數字[/d]+):不包括符號"."和"-"#region 是否是數字(0到9的數字[/d]+):不包括符號"."和"-"
- /// <summary>
-
-
-
- protected bool IsNumber()
- {
- ArrayList aryResult = new ArrayList();
- return CommRegularMatch(_String, @"[/d]+", RegexOptions.None, ref aryResult, _IsEntirety);
- }
- #endregion
- 是否只包含數字,英文和下劃線([/w]+)#region 是否只包含數字,英文和下劃線([/w]+)
- /// <summary>
-
-
-
- protected bool IsStringModel_01()
- {
- ArrayList aryResult = new ArrayList();
- return CommRegularMatch(_String, @"[/w]+", RegexOptions.None, ref aryResult, _IsEntirety);
- }
- #endregion
- 是否大寫首字母的英文字母([A-Z][a-z]+)#region 是否大寫首字母的英文字母([A-Z][a-z]+)
- /// <summary>
-
-
-
- protected bool IsStringModel_02()
- {
- ArrayList aryResult = new ArrayList();
- return CommRegularMatch(_String, @"[A-Z][a-z]+", RegexOptions.None, ref aryResult, _IsEntirety);
- }
- #endregion
- 是否全角字符([^/x00-/xff]):包括漢字在內#region 是否全角字符([^/x00-/xff]):包括漢字在內
- /// <summary>
-
-
-
- protected bool IsWideWord()
- {
- ArrayList aryResult = new ArrayList();
- return CommRegularMatch(_String, @"[^/x00-/xff]", RegexOptions.None, ref aryResult, _IsEntirety);
- }
- #endregion
- 是否半角字符([/x00-/xff])#region 是否半角字符([/x00-/xff])
- /// <summary>
-
-
-
- protected bool IsNarrowWord()
- {
- ArrayList aryResult = new ArrayList();
- return CommRegularMatch(_String, @"[/x00-/xff]", RegexOptions.None, ref aryResult, _IsEntirety);
- }
- #endregion
- 是否合法的中國身份證號碼#region 是否合法的中國身份證號碼
- protected bool IsChineseID()
- {
- if (_String.Length == 15)
- {
- _String = CidUpdate(_String);
- }
- if (_String.Length == 18)
- {
- string strResult = CheckCidInfo(_String);
- if (strResult == "非法地區" || strResult == "非法生日" || strResult == "非法證號")
- {
- return false;
- }
- else
- {
- return true;
- }
- }
- else
- {
- return false;
- }
- }
- #endregion
- #endregion
- 通用正則表達式判斷函數#region 通用正則表達式判斷函數
- /// <summary>
-
-
-
-
-
-
-
-
- public bool CommRegularMatch(string strVerifyString, string strRegular, System.Text.RegularExpressions.RegexOptions regOption, ref System.Collections.ArrayList aryResult, bool IsEntirety)
- {
- System.Text.RegularExpressions.Regex r;
- System.Text.RegularExpressions.Match m;
- 如果需要完全匹配的處理#region 如果需要完全匹配的處理
- if (IsEntirety)
- {
- strRegular = strRegular.Insert(0, @"/A");
- strRegular = strRegular.Insert(strRegular.Length, @"/z");
- }
- #endregion
- try
- {
- r = new System.Text.RegularExpressions.Regex(strRegular, regOption);
- }
- catch (System.Exception e)
- {
- throw (e);
- }
- for (m = r.Match(strVerifyString); m.Success; m = m.NextMatch())
- {
- aryResult.Add(m);
- }
- if (aryResult.Count == 0)
- {
- return false;
- }
- else
- {
- return true;
- }
- }
- #endregion
- 中國身份證號碼驗證#region 中國身份證號碼驗證
- private string CheckCidInfo(string cid)
- {
- string[] aCity = new string[] { null, null, null, null, null, null, null, null, null, null, null, "北京", "天津", "河北", "山西", "內蒙古", null, null, null, null, null, "遼寧", "吉林", "黑龍江", null, null, null, null, null, null, null, "上海", "江蘇", "浙江", "安微", "福建", "江西", "山東", null, null, null, "河南", "湖北", "湖南", "廣東", "廣西", "海南", null, null, null, "重慶", "四川", "貴州", "雲南", "西藏", null, null, null, null, null, null, "陝西", "甘肅", "青海", "寧夏", "新疆", null, null, null, null, null, "臺灣", null, null, null, null, null, null, null, null, null, "香港", "澳門", null, null, null, null, null, null, null, null, "國外" };
- double iSum = 0;
- string info = string.Empty;
- System.Text.RegularExpressions.Regex rg = new System.Text.RegularExpressions.Regex(@"^/d{17}(/d|x)$");
- System.Text.RegularExpressions.Match mc = rg.Match(cid);
- if (!mc.Success)
- {
- return string.Empty;
- }
- cid = cid.ToLower();
- cid = cid.Replace("x", "a");
- if (aCity[int.Parse(cid.Substring(0, 2))] == null)
- {
- return "非法地區";
- }
- try
- {
- DateTime.Parse(cid.Substring(6, 4) + " - " + cid.Substring(10, 2) + " - " + cid.Substring(12, 2));
- }
- catch
- {
- return "非法生日";
- }
- for (int i = 17; i >= 0; i--)
- {
- iSum += (System.Math.Pow(2, i) % 11) * int.Parse(cid[17 - i].ToString(), System.Globalization.NumberStyles.HexNumber);
- }
- if (iSum % 11 != 1)
- {
- return ("非法證號");
- }
- else
- {
- return (aCity[int.Parse(cid.Substring(0, 2))] + "," + cid.Substring(6, 4) + "-" + cid.Substring(10, 2) + "-" + cid.Substring(12, 2) + "," + (int.Parse(cid.Substring(16, 1)) % 2 == 1 ? "男" : "女"));
- }
- }
- #endregion
- 身份證號碼15升級爲18位#region 身份證號碼15升級爲18位
- private string CidUpdate(string ShortCid)
- {
- char[] strJiaoYan = { '1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2' };
- int[] intQuan = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 };
- string strTemp;
- int intTemp = 0;
- strTemp = ShortCid.Substring(0, 6) + "19" + ShortCid.Substring(6);
- for (int i = 0; i <= strTemp.Length - 1; i++)
- {
- intTemp += int.Parse(strTemp.Substring(i, 1)) * intQuan[i];
- }
- intTemp = intTemp % 11;
- return strTemp + strJiaoYan[intTemp];
- }
- #endregion
- }
- }