基础知识 - Golang 中的正则表达式
本文内容纲要:
------------------------------------------------------------
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