C# 正則表達(dá)式常用的符號(hào)和模式解析(最新推薦)
〇、正則表達(dá)式的基本語法符號(hào)
若只簡單匹配固定字符串,則無需任何修飾符,例如:需要匹配字符串 77
,則可直接寫:new Regex("77")
。
下邊例舉一下常用的符號(hào):(知道下面這些,一般的正則表達(dá)式便可清晰異常)
符號(hào) | 釋義 | 示例 1 | 示例 2 |
\ | 轉(zhuǎn)義字符,互相轉(zhuǎn)換一個(gè)具有特殊功能的字符 和一個(gè)普通字符 | 希望在字符串中至少有一個(gè)“\”,那么正則表達(dá)式應(yīng)該這么寫:\\+ |
|
^......$ | 開始標(biāo)記(^)和結(jié)束標(biāo)記($),中間為具體內(nèi)容 若沒有邊界,則表示匹配可在字符中匹配 | /^AA$/【解析】字符串‘AA’可匹配;‘AAA’不可匹配 | /AA$/【解析】取消開始符號(hào)‘^’則‘AAA’可匹配,表示以‘AA’結(jié)尾 |
* 、 + 、 ? 指定匹配子表達(dá)式的次數(shù) | * : 零次或多次; | + : 一次或多次; | ? : 零次或一次 |
[xxxx]、[^xxxx] | 中括號(hào),代表可選擇的字符集合,可為任意字符 加了 ^ 后,相反,不可選擇的字符集合 | [qw12]【解析】代表出現(xiàn)(q、w、1、2)中的字符均滿足條件 [A-Za-z0-9]【解析】數(shù)字+26個(gè)英文字母 | [^qw12]【解析】增加符號(hào)‘^’,意思與‘示例 1’中的意思相反,標(biāo)識(shí)不能出現(xiàn)(q、w、1、2)中的字符 |
{m,n} | 大括號(hào),匹配數(shù)量,代表可匹配 m~n 次連續(xù)字符, 另外‘,n’可省略 | a{2}【解析】出現(xiàn)‘aa’,例如‘123aaf4’可匹配 | a{2,}【解析】匹配2~∞次字符‘a’,即aa、aaa、aaaa...... |
. | 匹配除“/n”之外的任何 單個(gè)字符 | ||
(pattern)、(?:pattern)、(?=pattern)、(?!pattern) | (pattern):匹配 pattern 并獲?。?strong>(?:pattern):匹配但不獲取 | (?=pattern):正向預(yù)查,在任何匹配 pattern 的字符串開始處匹配查找字符串 | (?!pattern):負(fù)向預(yù)查,在任何不匹配 pattern 的字符串開始處匹配查找字符串 |
(xxx){n} | 小括號(hào),代表分組,即‘xxx’可出現(xiàn) n 次 | (12|34){2}【解析】匹配1212、1234、3412、3434 | |
xxx|xx | 豎線,選擇表達(dá)式 | 123|234【解析】代表匹配‘123’或者‘234’ | |
\數(shù)字 | 反斜線+數(shù)字,引用,數(shù)字代表引用前面第幾個(gè)捕獲分組 | <([a-z]+)><\/\1>【解析】引用第一個(gè)捕獲分組,可匹配‘<div></div>’ | |
\d \D | 匹配數(shù)字字符,0~9(相反 \D 代表非數(shù)字) | ||
\f \n \r | \f :匹配換頁符 | \n:匹配換行符 | \r:匹配回車符 |
\s \S | \s:匹配任何空白字符,包括空格、制表符、換頁符等 | \S:匹配任何非空白字符 | |
\w \W | \w:匹配包括下劃線的任何單詞字符,等價(jià)于:[A-Za-z0-9_] | \W:等價(jià)于:[^A-Za-z0-9_] | |
\t | 匹配一個(gè)制表符 |
一、Regex 類簡介
出自程序集:System.Text.RegularExpressions.dll。
1. Match 常用的兩個(gè)靜態(tài)重載
public static System.Text.RegularExpressions.Match Match (string input, string pattern); public static System.Text.RegularExpressions.Match Match (string input, string pattern, RegexOptions options);
RegexOptions 枚舉中常用的三個(gè):
IgnoreCase 表示不區(qū)分輸入的大小寫;
IgnorePatternWhitespace 表示去掉模式中的非轉(zhuǎn)義空白,并啟用由#標(biāo)記的注釋;
RightToLeft 表示從右向左掃描、匹配,這時(shí),靜態(tài)的Match方法返回從右向左的第一個(gè)匹配;
下邊是應(yīng)用實(shí)例:(寫法一對(duì)應(yīng)定義中的參數(shù))
string inputstr = "ADDR=1234;NAME=ZHANG;PHONE=6789"; {// 寫法一 Match match1 = Regex.Match(inputstr, "NAME=(.+);"); string value1 = match1.Groups[1].Value; // ZHANG;PHONE=6789;NAME=ZHENG } inputstr = "ADDR=1234;NAME=ZHANG;PHONE=6789;NAME=ZHENG;"; {// 寫法二 Regex reg = new Regex("NAME=(.+);"); Match match2 = reg.Match(inputstr); string value2 = match2.Groups[1].Value; // ZHANG } inputstr = "ADDR=1234;name=ZHANG;PHONE=6789"; {// 測(cè)試不區(qū)分大小寫 Match match3 = Regex.Match(inputstr, "NAME=(.+);", RegexOptions.IgnoreCase); string value3 = match3.Groups[1].Value; // ZHANG Match match31 = Regex.Match(inputstr, "NAME=(.+);"); string value31 = match31.Groups[1].Value; // "" } inputstr = "ADDR=1234;NAME=ZHANG;PHONE=6789"; {// 去掉模式中的非轉(zhuǎn)義空白 Match match4 = Regex.Match(inputstr, " N A ME = (.+) ;", RegexOptions.IgnorePatternWhitespace); string value4 = match4.Groups[1].Value; // pattern 中的空格在匹配時(shí)被忽略 // ZHANG Match match41 = Regex.Match(inputstr, " N AME=(.+);"); string value41 = match41.Groups[1].Value; // "" } inputstr = "ADDR=1234;NAME=ZHANG;;PHONE=6789;ADDR=1234;NAME=ZHANG;"; {// 從右向左掃描、匹配 Match match5 = Regex.Match(inputstr, ";NAME", RegexOptions.RightToLeft); int value5 = match5.Groups[1].Index; // 42 Match match51 = Regex.Match(inputstr, ";NAME"); int value51 = match51.Groups[1].Index; // 9 }
2. Matchs 靜態(tài)方法
Matchs 方法的匹配規(guī)則類似 Match,只是返回的為 MatchCollection。如下示例:
string line = "ADDR=1234;NAME=ZZHANG;NAME=ZZHENG;PHONE=6789;NAME="; { var matches = Regex.Matches(line, "NAME=(.{4})"); foreach(Match match in matches) { string value1 = match.Groups[1].Value; // ZZHA // ZZHE } }
3. IsMatch 靜態(tài)方法
以下是兩個(gè)常用的重載:
public static bool IsMatch (string input, string pattern); public static bool IsMatch (string input, string pattern, System.Text.RegularExpressions.RegexOptions options);
此方法返回一個(gè) bool,重載形式同靜態(tài)的 Matches,若輸入中匹配模式,返回 true,否則返回 false。
string inputstr = "ADDR=1234;NAME=ZZHANG;NAME=ZZHENG;PHONE=6789;NAME="; { var ismatch1 = Regex.IsMatch(inputstr, "NAME=(.{4})"); // true var ismatch2 = Regex.IsMatch(inputstr, "NAME=(.{400})"); // false }
二、常用示例
在使用正則表達(dá)式前,需先引用命名空間:
using System.Text.RegularExpressions;
1. 金額
傳入字符串類型的金額進(jìn)行判斷,若不是金額返回報(bào)錯(cuò)提示:
string pattern = @"^([1-9]\d{0,9}|0)(\.\d{1,2})?$"; // 兩位小數(shù) // 若需要匹配更多位數(shù)小數(shù),則可修改“\d{1,2}”中的數(shù)字 2 if (!Regex.IsMatch(jine, pattern)) return "金額格式有誤,請(qǐng)重新輸入!" ;
解析:^([1-9]\d{0,9}|0)(\.\d{1,2})?$
小數(shù)點(diǎn)前:其中 ([1-9]\d{0,9}|0) 中的第一位“[1-9]”代表為 1~9 的數(shù)字;“\d{0,9}” 代表一串 0~9 的數(shù)字,不限位數(shù);豎線“|”代表前后存在其一,后邊是 0,代表可以為小于 1 的小數(shù)。
小數(shù)點(diǎn)后:其中 (\.\d{1,2})? 問號(hào)表示此部分可省,第一位“[1-9]”代表為 1~9 的數(shù)字;“\d”代表數(shù)字,后邊的“{1,2}”表示有 1~2 位小數(shù)。
其他常用的數(shù)值模式:
0 或非 0 開頭的數(shù)字 | ^(0|[1-9][0-9]*)$ |
正整數(shù) | ^[1-9]\d*$ |
浮點(diǎn)數(shù) | ^(-?\d+)(\.\d+)?$ |
正數(shù)/負(fù)數(shù)/小數(shù) | ^(\-|\+)?\d+(\.\d+)?$ |
2. 電子郵箱(不允許存在連續(xù)的兩個(gè)點(diǎn)或兩個(gè)減號(hào))
郵箱地址分為兩個(gè)部分,@ 符號(hào)前和后。前一部分代表用戶名,后邊是電子郵件服務(wù)器的域名。
用戶名:可以是字母、數(shù)字、點(diǎn)號(hào)、減號(hào)、下劃線,但必須以數(shù)字或字母開頭,3~18 個(gè)字符;
域名規(guī)范:只能使用英文字母(a~z,不區(qū)分大小寫)、數(shù)字(0~9)以及連接符(-);連接符(-)不能連續(xù)出現(xiàn)、單獨(dú)注冊(cè),也不能放在開頭和結(jié)尾。
由于域名的種類太多了,因此本模塊只簡單校驗(yàn)以上條件。
string inputstr = "example@qq.com"; { var ismatch1 = Regex.IsMatch(inputstr, @"^([\w-\.]+)@([a-zA-Z0-9-\.]+)(\.[a-zA-Z0-9]+)$"); // true inputstr = "exa..mple@qq.com"; ismatch1 = Regex.IsMatch(inputstr, @"^((?!.*?\.\.)[\w-\.]+)@([a-zA-Z0-9-\.]+)(\.[a-zA-Z0-9]+)$"); // false ismatch1 = Regex.IsMatch(inputstr, @"^((?!.*?--)[\w-\.]+)@([a-zA-Z0-9-\.]+)(\.[a-zA-Z0-9]+)$"); // true inputstr = "ex.am-.ple@q-q.com"; ismatch1 = Regex.IsMatch(inputstr, @"^((?!.*?(--|\.\.))[\w-\.]+)@((?!.*?(--|\.\.))[a-zA-Z0-9-\.]+)(\.[a-zA-Z0-9]+)$"); // false ismatch1 = Regex.IsMatch(inputstr, @"^((?!.*?--)[\w-\.]+)@([a-zA-Z0-9-\.]+)(\.[a-zA-Z0-9]+)$"); // false // 最后一個(gè)最為準(zhǔn)確 ismatch1 = Regex.IsMatch(inputstr, @"^[a-zA-Z0-9]((?!.*?(\.\.|--))[a-zA-Z0-9\._-]){1,16}[a-zA-Z0-9]@([0-9a-zA-Z][0-9a-zA-Z-]{0,61}[0-9a-zA-Z]\.)+([0-9a-zA-Z][0-9a-zA-Z-]{0,61}[0-9a-zA-Z])$"); // true }
由測(cè)試結(jié)果可以得出結(jié)論:
若想簡單判斷郵件格式,可以用這個(gè):
^([\w-\.]+)@([a-zA-Z0-9-\.]+)(\.[a-zA-Z0-9]+)$
比較準(zhǔn)確判斷的話,請(qǐng)用這個(gè):
^[a-zA-Z0-9]((?!.*?(\.\.|--))[a-zA-Z0-9\._-]){1,16}[a-zA-Z0-9]@([0-9a-zA-Z][0-9a-zA-Z-]{0,61}[0-9a-zA-Z]\.)+([0-9a-zA-Z][0-9a-zA-Z-]{0,61}[0-9a-zA-Z])$
解析:首先是將長串分為多個(gè)小部分,如下:
// 正則表達(dá)式詳解 ^ [a-zA-Z0-9] // 用戶名首位 ((?!.*?(\.\.|--))[a-zA-Z0-9\._-]){1,16} [a-zA-Z0-9] // 用戶名末位 @ ([0-9a-zA-Z] // .分隔的前邊 n 段域名的首位 [0-9a-zA-Z-]{0,61} [0-9a-zA-Z]\.)+ ([0-9a-zA-Z] // .分隔的最后一段域名的首位 [0-9a-zA-Z-]{0,61} [0-9a-zA-Z]) // .分隔的最后一段域名的末位 $
3. IPv4
IP 的規(guī)則很簡單,就是:第一位和最后一位數(shù)字不能是 0 或 255。
允許 0 補(bǔ)位的模式:^(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])$
^ (25[0-4] // 250~254 |2[0-4]\d] // 200~249 |[01]?\d{2} // 10~199 |[1-9] // 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]) $
不允許 0 補(bǔ)位的模式:^(25[0-4]|2[0-4]\d]|1\d{2}|[1-9]\d|[1-9])\.(25[0-5]|2[0-4]\d]|1\d{2}|[1-9]\d|[0-9])\.(25[0-5]|2[0-4]\d]|1\d{2}|[1-9]\d|[0-9])\.(25[0-4]|2[0-4]\d]|1\d{2}|[1-9]\d|[1-9])$
^ (25[0-4] // 250~254 |2[0-4]\d] // 200~249 |1\d{2} // 100~199 |[1-9]\d // 10~99 |[1-9] // 1~9 ) \.(25[0-5]|2[0-4]\d]|1\d{2}|[1-9]\d|[0-9]) \.(25[0-5]|2[0-4]\d]|1\d{2}|[1-9]\d|[0-9]) \.(25[0-4]|2[0-4]\d]|1\d{2}|[1-9]\d|[1-9]) $
4. 固定電話
3 位或 4 位區(qū)號(hào);區(qū)號(hào)可以用小括號(hào)括起來;區(qū)號(hào)可以省略;區(qū)號(hào)與本地號(hào)間可以用減號(hào)或空格隔開;本地號(hào)首位不為 0;可以有3位數(shù)的分機(jī)號(hào),分機(jī)號(hào)前要加減號(hào)。
string inputstr = "(0290)-89898989-666"; { var ismatch1 = Regex.IsMatch(inputstr, @"^((\(0\d{2,3}\)|0\d{2,3})[- ])?[1-9]\d{7}(-\d{3})?$"); // true }
最佳的模式:^((\(0\d{2,3}\)|0\d{2,3})[- ])?[1-9]\d{7}(-\d{3})?$
^ ( (\(0\d{2,3}\) // 允許區(qū)號(hào)用小括號(hào)包裹 |0\d{2,3}) [- ] // 區(qū)號(hào)和本機(jī)號(hào)用 - 或空格隔開 )? [1-9]\d{7} (-\d{3})? $
5. 手機(jī)號(hào)碼
本次只識(shí)別國內(nèi)的電話號(hào)碼,國際區(qū)號(hào)為 (+86),可以整體省略,也可以單獨(dú)去掉加號(hào)或括號(hào)。
在根據(jù)國內(nèi)最新的手機(jī)號(hào)編碼進(jìn)行測(cè)試:
string inputstr = "17797797997"; var ismatch1 = Regex.IsMatch(inputstr, @"^((\+)?86|\((\+)?86\))?1(3[0-9]|4[01456879]|5[0-35-9]|6[2567]|7[0-8]|8[0-9]|9[0-35-9])\d{8}$"); // true
經(jīng)測(cè)試得出如下模式:
^((\+)?86|\((\+)?86\))?1(3[0-9]|4[01456879]|5[0-35-9]|6[2567]|7[0-8]|8[0-9]|9[0-35-9])\d{8}$
^ ((\+)?86|\((\+)?86\))? // 是否添加國際區(qū)號(hào) 1 // 1 開頭 ( 3[0-9] |4[01456879] |5[0-35-9] |6[2567] |7[0-8] |8[0-9]| 9[0-35-9]) \d{8} // 后八位隨機(jī) $
手機(jī)號(hào)的最新編碼,參考: 手機(jī)號(hào)驗(yàn)證最新正則表達(dá)式
6. 郵政編號(hào)
以數(shù)字 0 開頭的郵編是存在的,比如內(nèi)蒙古自治區(qū)呼和浩特市的 010000,所以對(duì)于郵編的六位,沒有區(qū)別。
因此,郵編的模式就是:
^\d{6}$
7. 網(wǎng)址
測(cè)試只包含域名地址:
string inputstr = "https://www.baidu.com/?tn=88093251_72_hao_pg"; var ismatch1 = Regex.IsMatch(inputstr, @"^((file|gopher|news|nntp|telnet|ftp|http|https|ftps|sftp)://)?(www\.)?(([a-zA-Z0-9\._-]+\.[a-zA-Z]{2,6}))(/[a-zA-Z0-9\&%_\./-~-]*)?$"); // true
測(cè)試可用的模式為:
^((file|gopher|news|nntp|telnet|ftp|http|https|ftps|sftp)://)?(www\.)?(([a-zA-Z0-9\._-]+\.[a-zA-Z]{2,6}))(/[a-zA-Z0-9\&%_\./-~-]*)?$
解析:
^ ((file|gopher|news|nntp|telnet|ftp|http|https|ftps|sftp)://)? (www\.)?([a-zA-Z0-9\._-]+\.[a-zA-Z]{2,6}) (/[a-zA-Z0-9\&%_\./-~-]*)? $
注:其中第三行表示的是域名地址,可以參考本章節(jié)中的“3. IPv4”將 IP 地址兼容。
8. 身份證號(hào)
身份證號(hào)的規(guī)則:
地址碼:長度 6 位,以不為 0 的數(shù)字開頭。即:^[1-9]\d{5}$。
年份:一般以 18、19、20 開頭,即:^(18|19|20)\d{2}$。
月份:1~9 月需要補(bǔ) 0 ,即:^((0[1-9])|(1[0-2]))$。
日期:1~31 ,即^((0[1-9]|[1-2][0-9])|30|31)$。
順序碼:3 位數(shù)字,即:^\d{3}$。
校驗(yàn)碼:1位數(shù)字或字母X或x,即^[0-9Xx]$。
// 測(cè)試 string inputstr = "11010519491231002X"; var ismatch1 = Regex.IsMatch(inputstr, @"^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))((0[1-9]|[1-2][0-9])|30|31)\d{3}[0-9Xx]$"); // true
測(cè)試結(jié)果:
^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))((0[1-9]|[1-2][0-9])|30|31)\d{3}[0-9Xx]$
參考: 身份證號(hào)碼的正則表達(dá)式及驗(yàn)證詳解
9. 經(jīng)緯度
經(jīng)度:-180.0~+180.0(整數(shù)部分為 0~180,必須輸入 1 到 5 位小數(shù))
^[\-\+]?(0?\d{1,2}\.\d{1,5}|1[0-7]?\d{1}\.\d{1,5}|180\.0{1,5})$
^ [-\+]? ( 0?\d{1,2}\.\d{1,5} |1[0-7]?\d{1}\.\d{1,5} |180\.0{1,5} // 可代表 180.00000 )
緯度:-90.0~+90.0(整數(shù)部分為 0~90,必須輸入 1 到 5 位小數(shù))
^[\-\+]?([0-8]?\d{1}\.\d{1,5}|90\.0{1,5})$
^ [-\+]? ( [0-8]?\d{1}\.\d{1,5} |90\.0{1,5} // 可代表:90.00000 ) $
到此這篇關(guān)于C# 正則表達(dá)式常用的符號(hào)和模式解析的文章就介紹到這了,更多相關(guān)C# 正則表達(dá)式符號(hào)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#使用windows服務(wù)開啟應(yīng)用程序的方法
這篇文章主要介紹了C#使用windows服務(wù)開啟應(yīng)用程序的方法,實(shí)例分析了C#操作windows服務(wù)開啟應(yīng)用程序所遇到的問題及相關(guān)解決技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09c# Process.Start()找不到系統(tǒng)文件的解決方法
vs1027在X64應(yīng)用程序下執(zhí)行process.start()時(shí),OK;但是在X86應(yīng)用程序下執(zhí)行process.start(),報(bào)錯(cuò):找不到系統(tǒng)文件,本文就詳細(xì)的介紹一下解決方法,感興趣的可以了解一下2023-09-09C#實(shí)現(xiàn)將商品金額小寫轉(zhuǎn)換成大寫的方法
這篇文章主要介紹了C#實(shí)現(xiàn)將商品金額小寫轉(zhuǎn)換成大寫的方法,涉及C#數(shù)組與字符串的相關(guān)操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-08-08C#連接Oracle數(shù)據(jù)庫字符串(引入DLL)的方式
這篇文章主要給大家介紹了關(guān)于C#連接Oracle數(shù)據(jù)庫字符串(引入DLL)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08