基礎知識 - Golang 中的Regex

來源:互聯網
上載者:User

基礎知識 - Golang 中的Regex

------------------------------------------------------------Golang中的Regex------------------------------------------------------------用法:------------------------------單一:        .                   匹配任意一個字元,如果設定 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<命名>子運算式)    被捕獲的組,該組被編號且被命名 (子匹配)        (?:子運算式)          非捕獲的組 (子匹配)        (?標記)               在組內設定標記,非捕獲,標記影響當前組後的Regex        (?標記:子運算式)      在組內設定標記,非捕獲,標記影響當前組內的子運算式        標記的文法是:        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)                       注意:Regex中不能使用 \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] 這樣的Regex,如果要在 [] 中匹配 - ,可以將 - 放在 [] 的開頭或結尾,例如 [-a-z] 或 [a-z-]  可以在 [] 中使用逸出字元:\f、\t、\n、\r、\v、\377、\xFF、\x{10FFFF}、\\、\^、\$、\.、\*、\+、\?、\{、\}、\(、\)、\[、\]、\|(具體含義見上面的說明)  如果在Regex中使用了分組,則在執行正則替換的時候,“替換內容”中可以使用 $1、${1}、$name、${name} 這樣的“分組引用符”擷取相應的分組內容。其中 $0 代表整個匹配項,$1 代表第 1 個分組,$2 代表第 2 個分組,……。  如果“分組引用符”是 $name 的形式,則在解析的時候,name 是取儘可能長的字串,比如:$1x 相當於 ${1x},而不是${1}x,再比如:$10 相當於 ${10},而不是 ${1}0。  由於 $ 字元會被轉義,所以要在“替換內容”中使用 $ 字元,可以用 \$ 代替。  上面介紹的Regex文法是“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 或 Goreg = 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 或 Goreg = regexp.MustCompile(`(?:Hell|G)o`)fmt.Printf("%q\n", reg.FindAllString(text, -1))// ["Hello" "Go"]// 尋找 Hello 或 Go,替換為 Hellooo、Goooreg = regexp.MustCompile(`(?PHell|G)o`)fmt.Printf("%q\n", reg.ReplaceAllString(text, "${n}ooo"))// "Hellooo 世界!123 Gooo."// 交換 Hello 和 Goreg = 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\\^$.*+?{}()[]|", "-"))// "----------------------"}------------------------------------------------------------

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.