------------------------------------------------------------ Golang中的正則表達式 ------------------------------------------------------------ 用法: ------------------------------ 單一: . 匹配任意一個字符,若是設置 s = true,則能夠匹配換行符 [字符類] 匹配「字符類」中的一個字符,「字符類」見後面的說明 [^字符類] 匹配「字符類」外的一個字符,「字符類」見後面的說明 \小寫Perl標記 匹配「Perl類」中的一個字符,「Perl類」見後面的說明 \大寫Perl標記 匹配「Perl類」外的一個字符,「Perl類」見後面的說明 [:ASCII類名:] 匹配「ASCII類」中的一個字符,「ASCII類」見後面的說明 [:^ASCII類名:] 匹配「ASCII類」外的一個字符,「ASCII類」見後面的說明 \pUnicode普通類名 匹配「Unicode類」中的一個字符(僅普通類),「Unicode類」見後面的說明 \PUnicode普通類名 匹配「Unicode類」外的一個字符(僅普通類),「Unicode類」見後面的說明 \p{Unicode類名} 匹配「Unicode類」中的一個字符,「Unicode類」見後面的說明 \P{Unicode類名} 匹配「Unicode類」外的一個字符,「Unicode類」見後面的說明 ------------------------------ 複合: xy 匹配 xy(x 後面跟隨 y) x|y 匹配 x 或 y (優先匹配 x) ------------------------------ 重複: x* 匹配零個或多個 x,優先匹配更多(貪婪) x+ 匹配一個或多個 x,優先匹配更多(貪婪) x? 匹配零個或一個 x,優先匹配一個(貪婪) x{n,m} 匹配 n 到 m 個 x,優先匹配更多(貪婪) x{n,} 匹配 n 個或多個 x,優先匹配更多(貪婪) x{n} 只匹配 n 個 x x*? 匹配零個或多個 x,優先匹配更少(非貪婪) x+? 匹配一個或多個 x,優先匹配更少(非貪婪) x?? 匹配零個或一個 x,優先匹配零個(非貪婪) x{n,m}? 匹配 n 到 m 個 x,優先匹配更少(非貪婪) x{n,}? 匹配 n 個或多個 x,優先匹配更少(非貪婪) x{n}? 只匹配 n 個 x ------------------------------ 分組: (子表達式) 被捕獲的組,該組被編號 (子匹配) (?P<命名>子表達式) 被捕獲的組,該組被編號且被命名 (子匹配) (?:子表達式) 非捕獲的組 (子匹配) (?標記) 在組內設置標記,非捕獲,標記影響當前組後的正則表達式 (?標記:子表達式) 在組內設置標記,非捕獲,標記影響當前組內的子表達式 標記的語法是: xyz (設置 xyz 標記) -xyz (清除 xyz 標記) xy-z (設置 xy 標記, 清除 z 標記) 能夠設置的標記有: i 不區分大小寫 (默認爲 false) m 多行模式:讓 ^ 和 $ 匹配整個文本的開頭和結尾,而非行首和行尾(默認爲 false) s 讓 . 匹配 \n (默認爲 false) U 非貪婪模式:交換 x* 和 x*? 等的含義 (默認爲 false) ------------------------------ 位置標記: ^ 若是標記 m=true 則匹配行首,不然匹配整個文本的開頭(m 默認爲 false) $ 若是標記 m=true 則匹配行尾,不然匹配整個文本的結尾(m 默認爲 false) \A 匹配整個文本的開頭,忽略 m 標記 \b 匹配單詞邊界 \B 匹配非單詞邊界 \z 匹配整個文本的結尾,忽略 m 標記 ------------------------------ 轉義序列: \a 匹配響鈴符 (至關於 \x07) 注意:正則表達式中不能使用 \b 匹配退格符,由於 \b 被用來匹配單詞邊界, 可使用 \x08 表示退格符。 \f 匹配換頁符 (至關於 \x0C) \t 匹配橫向製表符(至關於 \x09) \n 匹配換行符 (至關於 \x0A) \r 匹配回車符 (至關於 \x0D) \v 匹配縱向製表符(至關於 \x0B) \123 匹配 8 進制編碼所表明的字符(必須是 3 位數字) \x7F 匹配 16 進制編碼所表明的字符(必須是 3 位數字) \x{10FFFF} 匹配 16 進制編碼所表明的字符(最大值 10FFFF ) \Q...\E 匹配 \Q 和 \E 之間的文本,忽略文本中的正則語法 \\ 匹配字符 \ \^ 匹配字符 ^ \$ 匹配字符 $ \. 匹配字符 . \* 匹配字符 * \+ 匹配字符 + \? 匹配字符 ? \{ 匹配字符 { \} 匹配字符 } \( 匹配字符 ( \) 匹配字符 ) \[ 匹配字符 [ \] 匹配字符 ] \| 匹配字符 | ------------------------------ 能夠將「命名字符類」做爲「字符類」的元素: [\d] 匹配數字 (至關於 \d) [^\d] 匹配非數字 (至關於 \D) [\D] 匹配非數字 (至關於 \D) [^\D] 匹配數字 (至關於 \d) [[:name:]] 命名的「ASCII 類」包含在「字符類」中 (至關於 [:name:]) [^[:name:]] 命名的「ASCII 類」不包含在「字符類」中 (至關於 [:^name:]) [\p{Name}] 命名的「Unicode 類」包含在「字符類」中 (至關於 \p{Name}) [^\p{Name}] 命名的「Unicode 類」不包含在「字符類」中 (至關於 \P{Name}) ------------------------------------------------------------ 說明: ------------------------------ 「字符類」取值以下(「字符類」包含「Perl類」、「ASCII類」、「Unicode類」): x 單個字符 A-Z 字符範圍(包含首尾字符) \小寫字母 Perl類 [:ASCII類名:] ASCII類 \p{Unicode腳本類名} Unicode類 (腳本類) \pUnicode普通類名 Unicode類 (普通類) ------------------------------ 「Perl 類」取值以下: \d 數字 (至關於 [0-9]) \D 非數字 (至關於 [^0-9]) \s 空白 (至關於 [\t\n\f\r ]) \S 非空白 (至關於[^\t\n\f\r ]) \w 單詞字符 (至關於 [0-9A-Za-z_]) \W 非單詞字符 (至關於 [^0-9A-Za-z_]) ------------------------------ 「ASCII 類」取值以下 [:alnum:] 字母數字 (至關於 [0-9A-Za-z]) [:alpha:] 字母 (至關於 [A-Za-z]) [:ascii:] ASCII 字符集 (至關於 [\x00-\x7F]) [:blank:] 空白佔位符 (至關於 [\t ]) [:cntrl:] 控制字符 (至關於 [\x00-\x1F\x7F]) [:digit:] 數字 (至關於 [0-9]) [:graph:] 圖形字符 (至關於 [!-~]) [:lower:] 小寫字母 (至關於 [a-z]) [:print:] 可打印字符 (至關於 [ -~] 至關於 [ [:graph:]]) [:punct:] 標點符號 (至關於 [!-/:-@[-反引號{-~]) [:space:] 空白字符(至關於 [\t\n\v\f\r ]) [:upper:] 大寫字母(至關於 [A-Z]) [:word:] 單詞字符(至關於 [0-9A-Za-z_]) [:xdigit:] 16 進制字符集(至關於 [0-9A-Fa-f]) ------------------------------ 「Unicode 類」取值以下---普通類: C -其餘- (other) Cc 控制字符 (control) Cf 格式 (format) Co 私人使用區 (private use) Cs 代理區 (surrogate) L -字母- (letter) Ll 小寫字母 (lowercase letter) Lm 修飾字母 (modifier letter) Lo 其它字母 (other letter) Lt 首字母大寫字母 (titlecase letter) Lu 大寫字母 (uppercase letter) M -標記- (mark) Mc 間距標記 (spacing mark) Me 關閉標記 (enclosing mark) Mn 非間距標記 (non-spacing mark) N -數字- (number) Nd 十進制數字 (decimal number) Nl 字母數字 (letter number) No 其它數字 (other number) P -標點- (punctuation) Pc 鏈接符標點 (connector punctuation) Pd 破折號標點符號 (dash punctuation) Pe 關閉的標點符號 (close punctuation) Pf 最後的標點符號 (final punctuation) Pi 最初的標點符號 (initial punctuation) Po 其餘標點符號 (other punctuation) Ps 開放的標點符號 (open punctuation) S -符號- (symbol) Sc 貨幣符號 (currency symbol) Sk 修飾符號 (modifier symbol) Sm 數學符號 (math symbol) So 其餘符號 (other symbol) Z -分隔符- (separator) Zl 行分隔符 (line separator) Zp 段落分隔符 (paragraph separator) Zs 空白分隔符 (space separator) ------------------------------ 「Unicode 類」取值以下---腳本類: Arabic 阿拉伯文 Armenian 亞美尼亞文 Balinese 巴厘島文 Bengali 孟加拉文 Bopomofo 漢語拼音字母 Braille 盲文 Buginese 布吉文 Buhid 布希德文 Canadian_Aboriginal 加拿大土著文 Carian 卡里亞文 Cham 佔族文 Cherokee 切諾基文 Common 普通的,字符不是特定於一個腳本 Coptic 科普特文 Cuneiform 楔形文字 Cypriot 塞浦路斯文 Cyrillic 斯拉夫文 Deseret 猶他州文 Devanagari 梵文 Ethiopic 衣索比亞文 Georgian 格魯吉亞文 Glagolitic 格拉哥里文 Gothic 哥特文 Greek 希臘 Gujarati 古吉拉特文 Gurmukhi 果魯穆奇文 Han 漢文 Hangul 韓文 Hanunoo 哈魯喏文 Hebrew 希伯來文 Hiragana 平假名(日語) Inherited 繼承前一個字符的腳本 Kannada 坎那達文 Katakana 片假名(日語) Kayah_Li 克耶字母 Kharoshthi 卡羅須提文 Khmer 高棉文 Lao 老撾文 Latin 拉丁文 Lepcha 雷布查文 Limbu 林布文 Linear_B B類線形文字(古希臘) Lycian 利西亞文 Lydian 呂底亞文 Malayalam 馬拉雅拉姆文 Mongolian 蒙古文 Myanmar 緬甸文 New_Tai_Lue 新傣仂文 Nko Nko文 Ogham 歐甘文 Ol_Chiki 桑塔利文 Old_Italic 古意大利文 Old_Persian 古波斯文 Oriya 奧里亞文 Osmanya 奧斯曼亞文 Phags_Pa 八思巴文 Phoenician 腓尼基文 Rejang 拉讓文 Runic 古代北歐文字 Saurashtra 索拉什特拉文(印度縣城) Shavian 蕭伯納文 Sinhala 僧伽羅文 Sundanese 巽他文 Syloti_Nagri 錫爾赫特文 Syriac 敘利亞文 Tagalog 塔加拉文 Tagbanwa 塔格巴努亞文 Tai_Le 德宏傣文 Tamil 泰米爾文 Telugu 泰盧固文 Thaana 塔安那文 Thai 泰文 Tibetan 藏文 Tifinagh 提非納文 Ugaritic 烏加里特文 Vai 瓦伊文 Yi 彝文 ------------------------------------------------------------ 注意: 對於 [a-z] 這樣的正則表達式,若是要在 [] 中匹配 - ,能夠將 - 放在 [] 的開頭或結尾,例如 [-a-z] 或 [a-z-] 能夠在 [] 中使用轉義字符:\f、\t、\n、\r、\v、\37七、\xFF、\x{10FFFF}、\\、\^、\$、\.、\*、\+、\?、\{、\}、\(、\)、\[、\]、\|(具體含義見上面的說明) 若是在正則表達式中使用了分組,則在執行正則替換的時候,「替換內容」中可使用 $一、${1}、$name、${name} 這樣的「分組引用符」獲取相應的分組內容。其中 $0 表明整個匹配項,$1 表明第 1 個分組,$2 表明第 2 個分組,……。 若是「分組引用符」是 $name 的形式,則在解析的時候,name 是取儘量長的字符串,好比:$1x 至關於 ${1x},而不是${1}x,再好比:$10 至關於 ${10},而不是 ${1}0。 因爲 $ 字符會被轉義,因此要在「替換內容」中使用 $ 字符,能夠用 \$ 代替。 上面介紹的正則表達式語法是「Perl 語法」,除了「Perl 語法」外,Go 語言中還有另外一種「POSIX 語法」,「POSIX 語法」除了不能使用「Perl 類」以外,其它都同樣。 ------------------------------------------------------------ // 示例 func main() { text := `Hello 世界!123 Go.` // 查找連續的小寫字母 reg := regexp.MustCompile(`[a-z]+`) fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["ello" "o"] // 查找連續的非小寫字母 reg = regexp.MustCompile(`[^a-z]+`) fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["H" " 世界!123 G" "."] // 查找連續的單詞字母 reg = regexp.MustCompile(`[\w]+`) fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["Hello" "123" "Go"] // 查找連續的非單詞字母、非空白字符 reg = regexp.MustCompile(`[^\w\s]+`) fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["世界!" "."] // 查找連續的大寫字母 reg = regexp.MustCompile(`[[:upper:]]+`) fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["H" "G"] // 查找連續的非 ASCII 字符 reg = regexp.MustCompile(`[[:^ascii:]]+`) fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["世界!"] // 查找連續的標點符號 reg = regexp.MustCompile(`[\pP]+`) fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["!" "."] // 查找連續的非標點符號字符 reg = regexp.MustCompile(`[\PP]+`) fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["Hello 世界" "123 Go"] // 查找連續的漢字 reg = regexp.MustCompile(`[\p{Han}]+`) fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["世界"] // 查找連續的非漢字字符 reg = regexp.MustCompile(`[\P{Han}]+`) fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["Hello " "!123 Go."] // 查找 Hello 或 Go reg = regexp.MustCompile(`Hello|Go`) fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["Hello" "Go"] // 查找行首以 H 開頭,以空格結尾的字符串 reg = regexp.MustCompile(`^H.*\s`) fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["Hello 世界!123 "] // 查找行首以 H 開頭,以空白結尾的字符串(非貪婪模式) reg = regexp.MustCompile(`(?U)^H.*\s`) fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["Hello "] // 查找以 hello 開頭(忽略大小寫),以 Go 結尾的字符串 reg = regexp.MustCompile(`(?i:^hello).*Go`) fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["Hello 世界!123 Go"] // 查找 Go. reg = regexp.MustCompile(`\QGo.\E`) fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["Go."] // 查找從行首開始,以空格結尾的字符串(非貪婪模式) reg = regexp.MustCompile(`(?U)^.* `) fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["Hello "] // 查找以空格開頭,到行尾結束,中間不包含空格字符串 reg = regexp.MustCompile(` [^ ]*$`) fmt.Printf("%q\n", reg.FindAllString(text, -1)) // [" Go."] // 查找「單詞邊界」之間的字符串 reg = regexp.MustCompile(`(?U)\b.+\b`) fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["Hello" " 世界!" "123" " " "Go"] // 查找連續 1 次到 4 次的非空格字符,並以 o 結尾的字符串 reg = regexp.MustCompile(`[^ ]{1,4}o`) fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["Hello" "Go"] // 查找 Hello 或 Go reg = regexp.MustCompile(`(?:Hell|G)o`) fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["Hello" "Go"] // 查找 Hello 或 Go,替換爲 Hellooo、Gooo reg = regexp.MustCompile(`(?PHell|G)o`) fmt.Printf("%q\n", reg.ReplaceAllString(text, "${n}ooo")) // "Hellooo 世界!123 Gooo." // 交換 Hello 和 Go reg = regexp.MustCompile(`(Hello)(.*)(Go)`) fmt.Printf("%q\n", reg.ReplaceAllString(text, "$3$2$1")) // "Go 世界!123 Hello." // 特殊字符的查找 reg = regexp.MustCompile(`[\f\t\n\r\v\123\x7F\x{10FFFF}\\\^\$\.\*\+\?\{\}\(\)\[\]\|]`) fmt.Printf("%q\n", reg.ReplaceAllString("\f\t\n\r\v\123\x7F\U0010FFFF\\^$.*+?{}()[]|", "-")) // "----------------------" } ------------------------------------------------------------