摘要:程式碼驗證格式機制
命名空間:System.Text.RegularExpressions
表示 Regex 建構函式中指定的規則運算式是否要在指定的輸入字串中尋找相符項目。
如果規則運算式尋找到符合項目,則為 true,否則為 false。
Regex.IsMatch(string input, string pattern)
input 型別:System.String 用來搜尋比對的字串。
pattern 型別:System.String 要比對的規則運算式模式。
在指定的輸入字串內,使用指定的取代字串來取代符合指定之規則運算式的所有字串。
Regex.Replace(string input, string pattern, string replacement )
input 型別:System.String 用來搜尋比對的字串。
pattern 型別:System.String 要比對的規則運算式模式。
replacement 型別:System.String 取代字串。
傳回值 型別:System.String 與輸入字串相同的新字串 (不同之處是取代字串會取代每一個相符的字串)。
--------------------- 替 代 -----------------------------
替代只在取代模式內被允許。對於規則運算式內的相似功能,可使用反向參考 (例如,\1)。如需反向參考的詳細資訊,請參閱反向參考和反向參考建構。
逸出字元和替代是取代模式中唯一能夠辨認的特殊建構。下列章節所敘述的所有語法建構只被允許在規則運算式中使用,
它們無法在取代模式中被辨認。例如,取代模式 a*${txt}b 會插入字串 "a*",
後面接著符合 txt 擷取群組的子字串 (如果有),之後接的是字串 "b"。
* 字元在取代模式內不被當做中繼字元。同樣的,在規則運算式比對模式中無法辨認 $ 模式。
在規則運算式內,$ 代表字串的結尾。
下表顯示如何定義已命名和已編號的取代模式。
$ number 替代最後一個符合群組編號 number (十進位) 的子字串。
${ name } 替代最後一個符合 (?<name>) 群組的子字串。
$$ 替代單一的 "$" 常值 (Literal)。
$& 替代整個符合字串本身的複本。
$` 替代輸入字串中符合字串前面的所有文字。
$' 替代輸入字串中符合字串後面的所有文字。
$+ 替代最後擷取的群組。
$_ 替代整個輸入字串。
---------------------------- 基 本 無 寬 度 的 判 斷 提 示 -------------------------------------
下表所敘述的中繼字元不會導致引擎向前移動到字串或消耗字元。它們只會根據字串中的目前位置使比對成功或失敗。
例如,^ 指定目前位置是位於行首或字串開頭。所以,規則運算式 ^FTP 只會傳回那些發生在行首的 "FTP" 字元字串的發現項目。
^ 指定比對必須發生在字串開頭或行首。如需詳細資訊,請參閱規則運算式選項中的 Multiline 選項。
$ 指定必須比對必須發生在字串結尾、發生在字串結尾的 \n 之前,或發生在行尾。如需詳細資訊,請參閱規則運算式選項中的 Multiline 選項。
\A 指定比對必須發生在字串開頭 (忽略 Multiline 選項)。
\Z 指定比對必須發生在字串結尾,或發生在字串結尾的 \n 之前 (忽略 Multiline 選項)。
\z 指定比對必須發生在字串結尾 (忽略 Multiline 選項)。
\G 指定比對必須發生在先前比對結束的位置。與 Match.NextMatch() 一起使用時,這可確保比對是連續的。
\b 指定比對必須發生在 \w (英數) 和 \W (非英數) 字元之間的界限上。比對必須發生在字緣上 (也就是位於由任何非英數字元所分隔之文字的第一個或最後一個字元)。比對也可以在字串結尾的字組界限 (Word Boundary) 上發生。
\B 指定比對不可以發生在 \b 的界限上。
------------------------------- 數 量 詞 ----------------------------------------------------------
數量詞將選擇性數量資料加入規則運算式。數量詞運算式會套用到字元、群組或緊接在它之前的字元類別。
.NET Framework 規則運算式支援最少比對 (省略) 數量詞。
下表描述會影響比對的中繼字元。數量 n 和 m 是整數常數。
* 指定零或多個比對, 例如,\w* 或 (abc)*。相當於 {0,}。
+ 指定一個或多個比對,例如,\w+ 或 (abc)+。相當於 {1,}。
? 指定零或一個比對, 例如,\w? 或 (abc)?。相當於 {0,1}。
{ n } 指定精確 n 個比對, 例如 (pizza){2}。
{ n ,} 指定最少 n 個比對, 例如 (abc){2,}。
{ n , m } 指定最少 n 個,但不超過 m 個比對。
*? 盡可能指定消耗最少重複的第一個比對 (相當於省略法 *)。
+? 盡可能指定最少的重複,但最少一個重複 (相當於省略法 +)。
?? 如果可能的話,指定零重複或一個重複 (省略法?)。
{ n }? 相當於 {n} (省略法 {n})。
{ n ,}? 盡可能指定最少的重複,但最少 n 個 (省略法 {n,})。
{ n , m }? 盡可能在 n 和 m 之間指定最少的重複 (省略法 {n,m})。
--------------------------- 群 組 建 構 ------------------------------------------
群組建構會描寫規則運算式 (Regular Expression) 的子運算式 (Subexpression),而且通常會擷取輸入字串的子字串。下表說明規則運算式的群組建構。
( 子運算式 ) 擷取相符的子運算式 (或是非擷取的群組;如需詳細資訊,請參閱規則運算式選項中的 ExplicitCapture 選項)。使用 () 進行擷取會根據左括號的順序自動編號 (從一開始)。
第一個擷取 (擷取項目編號零) 是符合整個規則運算式模式的文字。
(?< name > 子運算式) 將符合的子運算式擷取到群組名稱或編號名稱中。用於 name 的字串不可包含任何標點符號,而且不能以數字當做開頭。您可以使用單引號來代替角括弧,例如 (?'name')。
(?< name1 - name2 > 子運算式) (對稱群組定義)。刪除先前定義的 name2 群組的定義,並且在 name1 群組中儲存先前定義的 name2 群組和目前群組之間的間隔。
如果沒有定義 name2 群組,比對會回溯。
因為刪除 name2 的最後一個定義會顯露 name2 的先前定義,所以這個建構允許 name2 群組的擷取堆疊當做計數器使用,
以追蹤巢狀建構 (例如括號)。在這個建構中,name1 是選擇性的。
您可以使用單引號來代替角括弧,例如 (?'name1-name2')。
(?: 子運算式) (非擷取的群組)。不會擷取與子運算式相符的子字串。
(?imnsx-imnsx: 子運算式) 套用或停用子運算式內的指定選項。例如,(?i-s: ) 開啟不區分大小寫功能以及停用單行模式。如需詳細資訊,請參閱規則運算式選項。
(?= 子運算式) (無寬度右合樣 (Positive Lookahead) 判斷提示 (Assertion))。只有在子運算式於右邊的這個位置進行比對時,才繼續比對。例如,\w+(?=\d)
比對後面接著數字的文字,而不比對數字。這個建構無法回溯。
(?! 子運算式) (無寬度右不合樣 (Negative Lookahead) 判斷提示)。只有在子運算式不於右邊的這個位置進行比對時,才繼續比對。例如,\b(?!un)\w+\b 比對不以 un 當做開頭的文字。
(?<= 子運算式) (無寬度左合樣 (Positive Lookbehind) 判斷提示)。只有在子運算式於左邊的這個位置進行比對時,才繼續比對。
例如,(?<=19)99 會比對 19 之後的 99 執行個體。這個建構無法回溯。
(?<! 子運算式) (無寬度左不合樣 (Negative Lookbehind) 判斷提示)。只有在子運算式不於左邊的位置進行比對時,才繼續比對。
(?> 子運算式) (非回溯子運算式,也稱為窮盡 (Greedy) 子運算式)。子運算式會完全比對一次,然後不參與逐步的回溯
(也就是說,子運算式只會比對由子運算式單獨比對的字串)。
根據預設,如果比對不成功,則回溯搜尋其他可能相符的字串。如果您知道回溯不會成功,便可以使用非回溯的子運算式來避免不必要的搜尋,以提升效能。
PS:已命名的擷取是根據左括號由左至右的順序 (類似未命名的擷取) 依序編號,
但是已命名的擷取之編號是在所有未命名的擷取已經計算之後才開始編號。例如,
模式 ((?<One>abc)/d+)?(?<Two>xyz)(.*) 會依編號和名稱產生下列擷取群組。(第一個擷取 (編號 0) 永遠參考整個模式)。
------------------------ 反 向 參 考 建 構 -----------------------------------------------------------------
下表列出將反向參考修飾詞加入規則運算式的選擇性參數。
\ number 反向參考。例如,(\w)\1 尋找雙字字元。
\k<name> 命名的反向參考。例如,(?<char>\w)\k<char> 會尋找雙字字元,運算式 (?<43>\w)\43 也有相同功能。
您可以使用單引號來代替角括弧,例如 \k'char'。
------------------------ 交 替 建 構 -----------------------------------------------------
| 比對任何一個由 | (分隔號) 字元分開的詞彙,例如 cat|dog|tiger。最左邊比對成功。
(?( expression )yes|no) 假如運算式於這個位置比對,就比對 "yes" 部分,否則就比對 "no" 部分。"no" 部分可以省略。
運算式可以是任何有效的子運算式,但是它會變為無寬度的判斷提示,因此這個語法相當於 (?(?=expression)yes|no)。
請注意,如果運算式是命名群組的名稱或擷取的群組編號,交替建構會被解譯為擷取測試 (說明在本表格的下一列)。
若要避免這些案例中的混淆,您可以明確地詳細說明 (?=expression) 的內部。
(?( name )yes|no) 假如命名的擷取字串具有相符的條件,就比對 "yes" 部分,否則就比對 "no" 部分。"no" 部分可以省略。
如果指定的名稱沒有對應到用於這個運算式的擷取群組之名稱或編號,
交替建構會被解譯為運算式測試 (描述在本表格的上一列)。
------------------------- 其 他 建 構 ----------------------------------------------------------
(? imnsx - imnsx ) 設定或停用選項,例如,在模式當中開啟或關閉不區分大小寫功能。如需特定選項的詳細資訊,
請參閱規則運算式選項。選項變更會一直生效,直到封入群組的結尾。請參閱群組建構 (?imnsx-imnsx: ) 的詳細資訊,此為較為清楚的格式。
(?# ) 在規則運算式內插入內嵌註解。註解結束於第一個右括號字元。
# [至行尾] X 模式註解。註解開始於未逸出的 #,並且繼續至行尾 (請注意,x 選項或 RegexOptions.IgnorePatternWhitespace 列舉選項
必須為這種類型的註解啟動以便被識別)。
------------------------- 驗 證 格 式 --------------------------------------
1. ^
寫在 pattern 第一個位置時,表示其後一符號必須出現在字串開頭的位置。寫在 pattern 中間位置時則為否定之意,表示字串中不可有 ^ 之後一符號的內容。
2. $
寫在 pattern 最後一個位置時,表示其前一符號必須出現在字串尾端的位置。寫在 pattern 中時無特別意義。
3. *
表示字串中有 0 到無數個其前一符號的內容。
4. +
表示字串中有 1 到無數個其前一符號的內容。
5. ?
表示字串中有 0 到 1個其前一符號的內容。
6. { }
表示前一符號在字串中的重覆次數。例如 /A{2}/ 表示 'A' 重覆兩次 (即 'AA') ;/A{2,}/ 表示字串含有 2 到無數多個 'A' ;/A{2,5}/ 表示含有 2 到 5 個 'A' 。
7. .
表示一個任意字元。
8. [ ]
表示字串含有括號中任一字元的內容。可以 - 表示一組連續字元,例如 /[a-z]/, /[0-9]/ 。注意, [] 僅代表一個字元,例如 /[abc]/ 表示 'a' 或 'b' 或 'c' ,而不是 'abc' 。
9. ( )
表示一個 sub pattern ,符合 sub pattern 的字串內容會被存放在匹配陣列中,並依序指派數字代表此 sub pattern 。可以此數字在 pattern 的其他地方引用內容,例如 /The h([0-9]) means Title (\1)/ 表示第 1 個 sub pattern 是 0 到 9 的任一字元,而 \1 表示匹配的內容。故 'The h1 means Title 1', 'The h2 means Title 2' 到 'The h9 means Title 9' 符合規則。
10. \
表示轉義 (escaping) ,將其後的字元視為一般字元。例如要表示字串中含有 '/' 字元時,就必須寫作 /\// 。
11. |
「或」意,字串中含有 '|' 之前一符號或後一符號的內容。例如 /image\.(jpg|png)/ 表示 'image.jpg' 或 'image.png' 。通常會用 () 括住 '|' 的前後符號。
12. \d
表示任何一個數字,意同 [0-9] 。
13. \D
表示任何一個非數字,意同 [^0-9] 。
14. \w
表示任何一個字元與數字以及 '_' ,意同 [a-zA-Z0-9_] 。
15. \W
表示任何一個 \w 以外的字元。
16. \s
表示任何一個空白符號,包括 \t, \v 等。
17. \S
表示任何一個非空白符號。
-----------------------------------------------------------------------------------