首页 文章资讯内容详情

基础知识 - Golang 中的正则表达式

2026-06-01 4 花语

本文内容纲要:

------------------------------------------------------------ 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私人使用区(privateuse) Cs代理区(surrogate) L-字母-(letter) Ll小写字母(lowercaseletter) Lm修饰字母(modifierletter) Lo其它字母(otherletter) Lt首字母大写字母(titlecaseletter) Lu大写字母(uppercaseletter) M-标记-(mark) Mc间距标记(spacingmark) Me关闭标记(enclosingmark) Mn非间距标记(non-spacingmark) N-数字-(number) Nd十進制数字(decimalnumber) Nl字母数字(letternumber) No其它数字(othernumber) P-标点-(punctuation) Pc连接符标点(connectorpunctuation) Pd破折号标点符号(dashpunctuation) Pe关闭的标点符号(closepunctuation) Pf最后的标点符号(finalpunctuation) Pi最初的标点符号(initialpunctuation) Po其他标点符号(otherpunctuation) Ps开放的标点符号(openpunctuation) S-符号-(symbol) Sc货币符号(currencysymbol) Sk修饰符号(modifiersymbol) Sm数学符号(mathsymbol) So其他符号(othersymbol) Z-分隔符-(separator) Zl行分隔符(lineseparator) Zp段落分隔符(paragraphseparator) Zs空白分隔符(spaceseparator) ------------------------------ “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_BB类线形文字(古希腊) Lycian利西亚文 Lydian吕底亚文 Malayalam马拉雅拉姆文 Mongolian蒙古文 Myanmar缅甸文 New_Tai_Lue新傣仂文 NkoNko文 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、\377、\xFF、\x{10FFFF}、\\、\^、\$、\.、\*、\+、\?、\{、\}、\(、\)、\[、\]、\|(具体含义见上面的说明) 如果在正则表达式中使用了分组,则在执行正则替换的时候,“替换内容”中可以使用$1、${1}、$name、${name}这样的“分组引用符”获取相应的分组内容。其中$0代表整个匹配项,$1代表第1个分组,$2代表第2个分组,……。 如果“分组引用符”是$name的形式,则在解析的时候,name是取尽可能长的字符串,比如:$1x相当于${1x},而不是${1}x,再比如:$10相当于${10},而不是${1}0。 由于$字符会被转义,所以要在“替换内容”中使用$字符,可以用\$代替。 上面介绍的正则表达式语法是“Perl语法”,除了“Perl语法”外,Go语言中还有另一种“POSIX语法”,“POSIX语法”除了不能使用“Perl类”之外,其它都一样。 ------------------------------------------------------------ //示例 funcmain(){ text:=`Hello世界!123Go.` //查找连续的小写字母 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""世界!123G""."] //查找连续的单词字母 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世界""123Go"] //查找连续的汉字 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""!123Go."] //查找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世界!123Go"] //查找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世界!123Gooo." //交换Hello和Go reg=regexp.MustCompile(`(Hello)(.*)(Go)`) fmt.Printf("%q\n",reg.ReplaceAllString(text,"$3$2$1")) //"Go世界!123Hello." //特殊字符的查找 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\\^$.*+?{}()[]|","-")) //"----------------------" } ------------------------------------------------------------

本文内容总结:

原文链接:https://www.cnblogs.com/golove/p/3269099.html