正則表達式

本文主要面向對正則表達式知之甚少或沒有使用經驗,但卻熟悉 ASP.NET、可藉助 .NET 編程的初學者。此外,但願本文連同 regular expression cheat sheet 成爲有正則表達式使用經驗的開發者的手頭參考資料或進修資料。本文討論內容以下:html

  1. 正則表達式使用歷史簡介正則表達式

  2. 簡單表達式數據庫

  3. 限定符express

  4. 元字符編程

  5. 字符類windows

  6. 預約義的集合元字符數組

  7. 表達式示例詳細內容服務器

  8. ASP.NET 中的驗證網絡

  9. 正則表達式 API函數

  10. 免費工具

  11. 高級主題概述

  12. 小結和其餘資源

一般,若是對本文或對正則表達式有疑問,請訪問 http://www.aspadvice.com/,經過 regex mailing list 提出問題。編寫此文時其中已有 350 多個訂戶參與。

正則表達式使用歷史簡介

正則表達式設計於五十年代,存在至今。正則表達式最初用於描述「正則集」,它們是一些神經生理學家研究的模式。正則表達式最先由數學家 Stephen Kleene 提出,最終由 Ken Thompson 在兩種很是流行的文本實用程序 qed 和 grep 中使用。Jeffrey Friedl 在其著做「Mastering Regular Expressions (2nd edition)」中對此做了進一步闡述。建議那些但願更多瞭解正則表達式理論和歷史的人看看這本書。

在最近的五十年中,正則表達式逐漸從模糊深奧的數學概念發展爲在各種工具和軟件包中應用的主要功能。儘管數十年來不少 UNIX 工具都支持正則表達式,但僅僅是近十年來,它纔在大部分 Windows 開發者工具包中獲得體現。在 Microsoft® Visual Basic® 6 或 Microsoft® VBScript 中,即便狀況理想,正則表達式仍難以使用。但隨着.NET Framework 的推行,正則表達式的支持發展到極點,全部 Microsoft 開發者和全部 .NET 語言均可以使用正則表達式。

那麼,正則表達式到底是什麼呢?正則表達式是一種語言,它能夠明確描述文本字符串中的模式。除了簡單描述這些模式以外,正則表達式引擎一般可用於遍歷匹配,並使用模式做爲分隔符來將字符串解析爲子字符串,或以智能方式替換文本或從新設置文本格式。正則表達式爲解決與文本處理有關的許多常見任務提供了有效而簡捷的方式。

在討論正則表達式時,一般以正則表達式匹配(或不匹配)的文本爲基礎分析正則表達式。本文(以及 System.Text.RegularExpressions 類)將在正則表達式交互操做中引用 3 個參與對象:正則表達式的「模式」、「輸入」字符串和字符串內的全部模式的「匹配」。

簡單表達式

最簡單的正則表達式你們都已熟悉,即文字字符串。特定的字符串可經過文字自己加以描述;像 foo 這樣的正則表達式模式可精確匹配輸入的字符串 foo。在本例中,也將匹配以下輸入:Thefoo d was quite tasty,若是但願精確匹配,這可能不是預期結果。

固然,使用正則表達式匹配等於它自身的精確字符串是沒有價值的實現,不能體現正則表達式的真正做用。假如不查找 foo,而是查找以字母 f 開頭的全部單詞,或全部 3 個字母的單詞,那該怎麼辦?目前,這超出了文字字符串的合理範圍。咱們須要更加深刻地研究正則表達式。下面是一個文字表達式示例及一些匹配的輸入。

模式

輸入(匹配)

foo

foofood、foot、「There's evil afoot.」

限定符

限定符提供了一種簡單方法,用於指定在模式中容許特定字符或字符集自身重複出現的次數。有 3 個非顯式限定符:

  1. *,描述「出現 0 或屢次」。

  2. +,描述「出現 1 或屢次」。

  3. ?,描述「出現 0 或 1 次」。

限定符始終引用限定符前(左邊)的模式,一般是單個字符,除非使用括號建立模式組。下面是一些模式示例及匹配的輸入。

模式

輸入(匹配)

fo*

foofoe、food、fooot、「forget it」、funny、 puffy

fo+

foofoe、food、foot、「forget it」

fo?

foo、foe、food、foot、「forget it」、funny、puffy

除了指定給定模式準確出現 0 或 1 次以外,? 字符還可強制模式或子模式匹配數目最少的字符(若是匹配輸入字符串中的多個字符)。

除了非顯式限定符(通常叫作限定符,但爲區別於下一組,故稱非顯式限定符)以外,還有顯式限定符。在模式出現次數方面,限定符的概念很是模糊。使用顯式限定符則可準確指定數字、範圍或數字集。顯式限定符位於所應用的模式的後邊,這一點與正則限定符同樣。顯式限定符使用花括號 {} 及其中的數字值表示模式出現次數的上下限。例如,x{5} 將準確匹配 5 個 x 字符 (xxxxx)。若是僅指定一個數字,則表示次數上限;若是數字後跟一個逗號,如 x{5,},表示匹配任何出現次數大於 4 的 x 字符。下面是一些模式示例及匹配的輸入。

模式

輸入(匹配)

ab{2}c

abbc、aaabbccc

ab{,2}c

acabcabbc、aabbcc

ab{2,3}c

abbcabbbc、aabbcc、aabbbcc

元字符

在正則表達式中,有一種意義特殊的構造,即元字符。目前已知的元字符有不少,如 *?+ 和 {} 字符。其餘字符在正則表達式語言中都有特殊的含義。這些字符包括:$ ^ . [ ( | ) ] 和 \

.(句點或點)元字符是最簡單但最經常使用的一個字符。它可匹配任何單字符。若是要指定某些模式可包含任意組合的字符,使用句點很是有用,但必定要在特定長度範圍內。此外,咱們知道表達式將對包含在較長字符串中的全部模式進行匹配,假如只須要精確匹配模式,又該怎麼辦?這在驗證方案中常常出現,例如,要確保用戶輸入的郵政編碼或電話號碼的格式正確。使用 ^ 元字符可指定字符串(或行)的開始,使用 $ 元字符可指定字符串(或行)的結束。經過將這些字符添加到模式的開始和結束處,可強制模式僅匹配精確匹配的輸入字符串。若是 ^ 元字符用在方括號 [ ] 指定的字符類的開頭,也有特殊的含義。具體內容見下。

(反斜槓)元字符既可根據特殊含義「轉義」字符,也可指定預約義集合元字符的實例。一樣,具體內容見下。爲了在正則表達式中包括文字樣式的元字符,必須使用反斜槓進行「轉義」。例如,若是要匹配以「c:\」開始的字符串,可以使用:^c:\\。注意,要使用 ^ 元字符指出字符串必須以此模式做爲開始,而後用反斜槓元字符轉義文字反斜槓。

|(管道)元字符用於交替指定,特別用於在模式中指定「此或彼」。例如,a|b 將匹配包含「a」或「b」的任何輸入內容,這與字符類 [ab] 很是相似。

最後,括號 ( ) 用於給模式分組。它容許使用限定符讓一個完整模式出現屢次。爲了便於閱讀,或分開匹配特定的輸入部分,可能容許分析或從新設置格式。

下面列出元字符的一些使用示例。

模式

輸入(匹配)

.

abc123

.*

Abc123任意字符串無字符時也匹配

^c:\\

c:\windowsc:\\\\\c:\foo.txtc:\ 後跟任何其餘內容

abc$

abc123abc abc 結束的任意字符串

(abc){2,3}

abcabcabcabcabc

字符類

字符類是正則表達式中的「迷你」語言,在方括號 [ ] 中定義。最簡單的字符類只不過是括號中的一個字符表,如 [aeiou]。在表達式中使用字符類時,可在模式的此位置使用其中任何一個字符(但只能使用一個字符,除非使用了限定符)。請注意,不能使用字符類定義單詞或模式,只能定義單個字符。

要指定任何數值數字,可使用字符類 [0123456789]。可是,因爲這樣使用字符不大方便,因此要經過在括號中使用連字符 - 來定義字符的範圍。連字符在字符類中有特殊的含義(不是在正則表達式中,所以,準確地說它不能叫正則表達式元字符),且僅在連字符不是第一個字符時,連字符纔在字符類中有特殊含義。要使用連字符指定任何數值數字,可使用 [0-9]。小寫字母也同樣,可使用 [a-z],大寫字母可使用 [A-Z]。連字符定義的範圍取決於使用的字符集。所以,字符在(例如)ASCII 或 Unicode 表中出現的順序肯定了在範圍中包括的字符。若是須要在範圍中包括連字符,將它指定爲第一個字符。例如:[-.?] 將匹配 4 個字符中任何一個字符(注意,最後的字符是個空格)。另請注意,正則表達式元字符在字符類中不作特殊處理,因此這些元字符不須要轉義。考慮到字符類是與其餘正則表達式語言分開的一種語言,所以字符類有本身的規則和語法。

若是使用字符 ^ 做爲字符類的第一個字符來否認此類,也能夠匹配字符類成員之外的任何字符。所以,要匹配任何非元音字符,可使用字符類 [^aAeEiIoOuU]。注意,若是要否認連字符,應將連字符做爲字符類的第二個字符,如 [^-]。記住,在字符類中的做用與它在正則表達式模式中的做用徹底不一樣。

下面列出操做中使用的一些字符類。

模式

輸入(匹配)

^b[aeiou]t$

Batbetbitbotbut

^[0-9]{5}$

111111234599999

^c:\\

c:\windowsc:\\\\\c:\foo.txtc:\ 後跟任何其餘內容

abc$

abc123abc abc 結束的任意字符串

(abc){2,3}

abcabcabcabcabc

^[^-][0-9]$

012、... (不匹配 -0、-一、 -2 等)

在 .NET Framework 的下一版中,代碼名「Whidbey」做爲一種新功能被添加到字符類中,稱做字符類差 (character class subtraction)。它的主要做用是,容許從一個字符類中減去另外一個字符類,可提供更可讀的方式描述某些模式。該規範可經過如下地址訪問:http://www.gotdotnet.com/team/clr/bcl/TechArticles/techarticles/Specs/Regex/CharacterClassSubtraction.doc。它的語法相似 [a-z-[aeiou]],匹配全部的小寫輔音字母。

預約義的集合元字符

使用目前提供的工具能夠完成不少工做。可是,要使用 [0-9] 表示模式中的每一個數值數字,或(更糟)使用 [0 -9a -zA-Z]表示任何字母數字字符,還有一段至關漫長的過程。爲了減輕處理這些經常使用但冗長模式的痛苦,事先定義了預約義元字符集合。正則表達式的不一樣實現定義了不一樣的預約義元字符集合,下面描述的預約義元字符集合在 .NET Framework 中獲得System.Text.RegularExpressions API 的支持。這些預約義元字符的標準語法是,在反斜槓 \ 後跟一個或多個字符。多數預約義元字符只有一個字符,它們的使用很容易,是冗長字符類的理想替代字符。如下是兩個示例:\d 匹配全部數值數字,\w 匹配全部單詞字符(字母數字加下劃線)。例外狀況是一些特定字符代碼匹配,此時必須指定所匹配字符的地址,如 \u000D 將匹配 Unicode 回車符。下面列出一些最經常使用的字符類及其等效的元字符。

元字符

等效字符類

\a

匹配鈴聲(警報);\u0007

\b

匹配字符類外的字邊界,它匹配退格字符,\u0008

\t

匹配製表符,\u0009

\r

匹配回車符,\u000D

\w

匹配垂直製表符,\u000B

\f

匹配換頁符,\u000C

\n

匹配新行,\u000A

\e

匹配轉義符,\u001B

\040

匹配 3 位 8 進制 ASCII 字符。\040 表示空格(十進制數 32)。

\x20

使用 2 位 16 進制數匹配 ASCII 字符。此例中,\x2- 表示空格。

\cC

匹配 ASCII 控制字符,此例中是 ctrl-C。

\u0020

使用 4 位 16 進制數匹配 Unicode 字符。此例中 \u0020 是空格。

\*

不表明預約義字符類的任意字符都只做爲該字符自己對待。所以,\* 等同於 \x 2A(是文字 *,不是 * 元字符)。

\p{name}

匹配已命名字符類「name」中的任意字符。支持名稱是 Unicode 組和塊範圍。例如,Ll、Nd、Z、IsGreek、IsBoxDrawing 和 Sc(貨幣)。

\p{name}

匹配已命名字符類「name」中不包括的文本。

\w

匹配任意單詞字符。對於非 Unicode 和 ECMAScript 實現,這等同於 [a-zA-Z_0-9]。在 Unicode 類別中,這等同於 [\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}]

\W

\w 的否認,等效於 ECMAScript 兼容集合 [^a-zA-Z_0-9] 或 Unicode 字符類別 [^\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}]

\s

匹配任意空白區域字符。等效於 Unicode 字符類 [\f\n\r\t\v\x85\p{Z}]。若是使用 ECMAScript 選項指定 ECMAScript 兼容方式,\s 等效於 [ \f\n\r\t\v] (請注意前導空格)。

\S

匹配任意非空白區域字符。等效於 Unicode 字符類別 [^\f\n\r\t\v\x85\p{Z}]。若是使用 ECMAScript 選項指定 ECMAScript 兼容方式,\S 等效於 [^ \f\n\r\t\v] (請注意 ^ 後的空格)。

\d

匹配任意十進制數字。在 ECMAScript 方式下,等效於 Unicode 的 [\p{Nd}]、非 Unicode 的 [0-9]

\D

匹配任意非十進制數字。在 ECMAScript 方式下,等效於 Unicode 的 [\p{Nd}]、非 Unicode 的 [^0-9]

表達式示例

不少人都喜歡經過示例學習,下面即提供一些表達式示例。要獲取更多示例,請訪問如下地址中的正則表達式聯機數據庫:http://www.regexlib.com/

模式

說明

^\d{5}$

5 個數值數字,如美國郵政編碼。

^(\d{5})|(\d{5}-\d{4}$

5 個數值數字或 5 個數字-短劃線-4 個數字。匹配 5 位數字格式的美國郵政編碼,或 5 位數字 + 4 位數字格式的美國郵政編碼。

^(\d{5}(-\d{4})?$

與前一個相同,但更有效。使用 ? 可以使模式中的 4 位數字成爲可選部分,而不是要求分別比較不一樣的兩個模式(經過另外一種方式)。

^[+-]?\d+(\.\d+)?$

匹配任意有可選符號的實數。

^[+-]?\d*\.?\d*$

與上一個相同,但也匹配空字符串。

^(20|21|22|23|[01]\d)[0-5]\d$

匹配 24 小時制時間值。

/\*.*\*/

匹配 C 語言風格的註釋 /* ... */

ASP.NET 中的驗證

ASP.NET 提供了一套驗證控件,與使用舊的(或願意的話使用傳統的) ASP 處理任務相比,驗證控件使在 Web 窗體上驗證輸入變得很是容易。其中一個很是有效的驗證器是RegularExpressionValidator,如您所料,它容許您提供必須匹配輸入的正則表達式來驗證輸入。設置控件的 ValidationExpression 屬性可指定正則表達式的模式。下面顯示了驗證郵政代碼字段的驗證程序:

<asp:RegularExpressionValidator runat="server" id="ZipCodeValidator" 
ControlToValidate="ZipCodeTextBox" ErrorMessage="Invalid ZIP code 
format; format should be either 12345 or 12345-6789."  
ValidationExpression="(\d{5}(-\d{4})?" />

使用 RegularExpressionValidator 要注意幾個問題:

  • 決不要使用驗證程序要驗證的控件中的空字符串來激活驗證器。只有 RequiredFieldValidator 才能夠捕獲空字符串。

  • 您無需指定匹配字符的開始與結尾(^ 和$)- 它們是事先假設的。若是添加了開始與結尾,也沒有任何影響,不須要這樣作。

  • 對於全部驗證控件來講,必須在客戶端以及服務器端進行驗證。若是正則表達式不是 ECMAScript 兼容方式,客戶端驗證將失敗。爲了不這種狀況,確保表達式是 ECMAScript 兼容方式,不然只在服務器端進行控件驗證。

正則表達式 API

除了 ASP.NET 驗證控件,在.NET 中使用正則表達式的大多數狀況都要使用 System.Text.RegularExpressions 命名空間中發現的類。特別是那些您但願熟悉的主類 RegexMatch 和MatchCollection

順便說一下,正則表達式縮寫樣式 regex 的發音到底是 /reg-eks/ 仍是 /rej-eks/,還有一些爭議。本人傾向於後者,但兩種發音都有專家贊同,因此選擇哪一個發音由您本身決定。

Regex 類有大量的方法和屬性,若是您之前沒有用過它,可能會感到無所適從。下面彙總了一些最經常使用的方法:

方法

說明

Escape / Unescape

字符串中的轉義元字符,用做表達式中的文字。

IsMatch

若是正則表達式在輸入字符串中發現匹配,返回「Ture」。

Match

若是在輸入字符串中發現匹配,則返回匹配對象。

Matches

若是在輸入字符串中發現包含任何或所有匹配,則返回匹配集合對象。

Replace

用給定的替換字符串替換輸入字符串中的匹配。

Split

將輸入字符串拆分紅用正則表達式匹配分開的數組元素時,返回數組字符串。

除了指定不少方法外,還有一些選項能夠指定,一般在 Regex 對象構造函數中。因爲這些選項是位屏蔽的一部分,或許能夠同時指定這些選項(如,能夠同時指定 Multiline 和 Singleline)。

方法

說明

Compiled

當在循環中執行許多匹配操做時使用此選項。這能夠節省每一循環的分析表達式步驟。

Multiline

它與輸入字符串中的行數沒有關係。確切地說,它只修改 ^ 和 $ 的方式,以便匹配行開始 (BOL) 和行結尾 (EOL),而不是匹配整個輸入字符串的開始和結尾。

IgnoreCase

使模式在匹配搜索字符串時忽略大小寫。

IgnorePatternWhitespace

容許根據須要在模式中包括任意數量的空白區域,也支持使用 (?# 註釋 #) 語法在模式中加入註釋。

SingleLine

它與輸入字符串中的行數沒有關係。更確切地說,它將致使 .(句點)元字符匹配任意字符,而不是除 \n 以外的任意字符(默認狀況)。

使用正則表達式常執行的操做包括:驗證、匹配和替換。大多數狀況下,可使用 Regex 類的靜態方法完成這些操做,不須要實例化 Regex 類自己。要執行驗證,所有要作的就是必建或找到正確的表達式,而後使用 Regex 類的 IsMatch() 方法將表達式應用到輸入字符串中。例如,下面的函數演示瞭如何使用正則表達式驗證郵政編碼:

private void ValidateZipButton_Click(object sender, System.EventArgs e)
{
   String ZipRegex = @"^\d{5}$";
   if(Regex.IsMatch(ZipTextBox.Text, ZipRegex))
   {
      ResultLabel.Text = "ZIP is valid!";
   }
   else
   {
      ResultLabel.Text = "ZIP is invalid!";
   }
}

相似的,可使用靜態 Replace() 方法將匹配替換爲特定字符串,以下所示:

String newText = Regex.Replace(inputString, pattern, replacementText);

最後,可使用以下代碼遍歷輸入字符串的匹配集合:

private void MatchButton_Click(object sender, System.EventArgs e)
{
   MatchCollection matches = Regex.Matches(SearchStringTextBox.Text, 
MatchExpressionTextBox.Text);
   MatchCountLabel.Text = matches.Count.ToString();
   MatchesLabel.Text = "";
   foreach(Match match in matches)
   {
      MatchesLabel.Text += "Found" + match.ToString() + " at 
position " + match.Index + ".<br>";
   }
}

一般,在您須要指定默認方式之外的方式時,須要實例化 Regex 類的實例。特別是在設置選項時。例如,要建立忽略大小寫和模式空白區域的 Regex 實例,而後檢索與該表達式匹配的集合,則應使用以下代碼:

Regex re = new Regex(pattern, 
   RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace);
MatchCollection mc = re.Matches(inputString);

本文的下載文件中包括這些示例的完整使用版本,與簡單 ASP.NET 頁中的同樣。

免費工具

Regulator (http://royo.is-a-geek.com/iserializable/regulator/) - 一種在客戶端運行的正則表達式測試工具,經過 Web 服務與 RegexLib 緊密集成,提供對「匹配」、「拆分」和「替換」等的支持。包括性能分析和語法突出顯示功能。

RegexDesigner.NET (http://www.sellsbrothers.com/tools/) - 一種功能強大的可視工具,可幫助構造並測試正則表達式。它可生成 C# 和/或 VB.NET 代碼和已編譯彙編代碼,幫助您將表達式集成到應用程序中。

Regular Expression Workbench (v2.0) (http://www.gotdotnet.com/Community/UserSamples/Details.aspx?SampleGuid=C712F2DF-B026-4D58-8961-4EE2729D7322) - Eric Gunnerson 開發的工具,用於建立、測試和研究正則表達式。具備「Examine-o-matic」功能,容許將鼠標懸停在正則表達式的上方,對其含義進行解碼。

高級主題

正則表達式有兩個不得不說的功能,一個是「命名組」,另外一個是「四向處理」(lookaround processing)。因爲這些功能不多使用,此處只簡單闡述一下。

使用命名組,您可單獨命名匹配組,而後在表達式中使用程序語言引用這些組。若是結合 Replace 方法從新設置輸入字符串的格式(經過從新排列順序、替換輸入字符串中的元素),這個功能特別有效。例如,假設日期使用 MM/DD/YYYY 格式的字符串,而您但願日期格式是 DD-MM-YYYY。此時,可編寫一個表達式捕獲第一種格式,遍歷它的匹配集合,並分析每一個字符串,而後使用字符串操做創建替換字符串。這須要大量的代碼和大量的處理。若是使用命名組,您可完成一樣的任務,具體見下:

String MDYToDMY(String input)
{
   return Regex.Replace(intput, @"\b(?<month>\d{1,2})/(?<day>\d{1,2}/(?<year>\d{4})\b", "${day}-
${month}-${year}");
}

您還能夠按編號或按名稱引用組。在任何狀況下,這種引用通稱做「反向引用」。另外一個常用反向引用的場合在匹配表達式自己,以下這個表達式用於查找重複的字母:[a-z]\1。它將匹配「aa」、「bb」、「cc」,但它不一樣於 [a-z]{2} 或 [a-z][a-z],後二者是等效的,後二者容許匹配「ab」或「ac」或任何其餘兩個字母的組合。反向引用容許表達式記住表達式已經分析並匹配過的輸入字符串中的部分字符。

「四向處理」指不少正則表達式引擎所支持的正負 Lookahead 和 Lookbehind 功能。並非全部的正則表達式引擎都支持驗證四向處理。這些構造不使用字符,即便它們能夠匹配字符。有些模式可能在不使用四向處理的狀況下沒法描述。特別是當模式中存在的一部分依賴於另外一部分,若是不使用四向處理,則不能描述這樣的模式。下面介紹了每一個四向處理的語法。

語法

說明

(?=...)

正 Lookahead

(?!...)

負 Lookahead

(?<=...)

正 Lookbehind

(?<!...)

負 Lookbehind

密碼驗證是必需四向處理的一個示例。假定在密碼限制中,密碼必須介於 4 到 8 個字符,且必須至少包含一個數字。爲此,您能夠僅在匹配中測試 \d,而後使用字符串操做來測試長度。但要在正則表達式中實現這一切,必須使用 Lookahead。特別是正 lookahead,以下所示:^(?=.*\d).{4,8}$

結論

正則表達式是一種描述文本模式的極有效方法,它使文本模式成爲字符串驗證和操做的極好資源。.NET Framework 經過 System.Text.RegularExpressions 命名空間(特別是其中的Regex 類)提供了對正則表達式的強大支持。使用 API 很簡單,但編寫正確的正則表達式一般比較費力。但幸運的是,正則表達式能夠重複使用,您能夠經過網絡中的各類聯機資源,從中找出其餘人設計的表達式,或者在建立表達式遇到困難時獲得幫助。

資源

正則表達式庫 http://www.regexlib.com/

正則表達式討論列表 http://aspadvice.com/login.aspx?ReturnUrl=%2fSignUp%2flist.aspx%3fl%3d68%26c%3d16&l=68&c=16

正則表達式論壇 http://forums.regexadvice.com/

正則表達式 Web 日誌 http://blogs.regexadvice.com/

Mastering Regular Expressions (O'Reilly),做者 Jeffrey Friedl http://www.regex.info/

.NET 正則表達式參考 http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemTextRegularExpressions.asp

Jscript 正則表達式語法 http://www.msdn.microsoft.com/library/en-us/script56/html/js56jsgrpRegExpSyntax.asp

正則表達式信息 http://www.regular-expressions.info/

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息