加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-16 09:33:51 所属栏目:大数据 来源:网络整理
导读:------------------------------------------------------------Golang中的正则表达式------------------------------------------------------------用法:------------------------------单一:? ? .? ? ? ? 匹配任意一个字符,如果设置 s = true ,则可以
------------------------------------------------------------

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?   ?   ?    空白 (相当于 [tnfr ])
?   S?   ?   ?    非空白 (相当于[^tnfr ])
?   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-x1Fx7F])
?   [:digit:]?     数字 (相当于 [0-9])
?   [:graph:]?     图形字符 (相当于 [!-~])
?   [:lower:]?     小写字母 (相当于 [a-z])
?   [:print:]?     可打印字符 (相当于 [ -~] 相当于 [ [:graph:]])
?   [:punct:]?     标点符号 (相当于 [!-/:[email?protected][-反引号{-~])
?   [:space:]?     空白字符(相当于 [tnvfr ])
?   [: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、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 类”之外,其它都一样。

------------------------------------------------------------

// 示例
func main() {
	text := `Hello 世界!123 Go.`

	// 查找连续的小写字母
	reg := regexp.MustCompile(`[a-z]+`)
	fmt.Printf("%qn",reg.FindAllString(text,-1))
	// ["ello" "o"]

	// 查找连续的非小写字母
	reg = regexp.MustCompile(`[^a-z]+`)
	fmt.Printf("%qn",-1))
	// ["H" " 世界!123 G" "."]

	// 查找连续的单词字母
	reg = regexp.MustCompile(`[w]+`)
	fmt.Printf("%qn",-1))
	// ["Hello" "123" "Go"]

	// 查找连续的非单词字母、非空白字符
	reg = regexp.MustCompile(`[^ws]+`)
	fmt.Printf("%qn",-1))
	// ["世界!" "."]

	// 查找连续的大写字母
	reg = regexp.MustCompile(`[[:upper:]]+`)
	fmt.Printf("%qn",-1))
	// ["H" "G"]

	// 查找连续的非 ASCII 字符
	reg = regexp.MustCompile(`[[:^ascii:]]+`)
	fmt.Printf("%qn",-1))
	// ["世界!"]

	// 查找连续的标点符号
	reg = regexp.MustCompile(`[pP]+`)
	fmt.Printf("%qn",-1))
	// ["!" "."]

	// 查找连续的非标点符号字符
	reg = regexp.MustCompile(`[PP]+`)
	fmt.Printf("%qn",-1))
	// ["Hello 世界" "123 Go"]

	// 查找连续的汉字
	reg = regexp.MustCompile(`[p{Han}]+`)
	fmt.Printf("%qn",-1))
	// ["世界"]

	// 查找连续的非汉字字符
	reg = regexp.MustCompile(`[P{Han}]+`)
	fmt.Printf("%qn",-1))
	// ["Hello " "!123 Go."]

	// 查找 Hello 或 Go
	reg = regexp.MustCompile(`Hello|Go`)
	fmt.Printf("%qn",-1))
	// ["Hello" "Go"]

	// 查找行首以 H 开头,以空格结尾的字符串
	reg = regexp.MustCompile(`^H.*s`)
	fmt.Printf("%qn",-1))
	// ["Hello 世界!123 "]

	// 查找行首以 H 开头,以空白结尾的字符串(非贪婪模式)
	reg = regexp.MustCompile(`(?U)^H.*s`)
	fmt.Printf("%qn",-1))
	// ["Hello "]

	// 查找以 hello 开头(忽略大小写),以 Go 结尾的字符串
	reg = regexp.MustCompile(`(?i:^hello).*Go`)
	fmt.Printf("%qn",-1))
	// ["Hello 世界!123 Go"]

	// 查找 Go.
	reg = regexp.MustCompile(`QGo.E`)
	fmt.Printf("%qn",-1))
	// ["Go."]

	// 查找从行首开始,以空格结尾的字符串(非贪婪模式)
	reg = regexp.MustCompile(`(?U)^.* `)
	fmt.Printf("%qn",-1))
	// ["Hello "]

	// 查找以空格开头,到行尾结束,中间不包含空格字符串
	reg = regexp.MustCompile(` [^ ]*$`)
	fmt.Printf("%qn",-1))
	// [" Go."]

	// 查找“单词边界”之间的字符串
	reg = regexp.MustCompile(`(?U)b.+b`)
	fmt.Printf("%qn",-1))
	// ["Hello" " 世界!" "123" " " "Go"]

	// 查找连续 1 次到 4 次的非空格字符,并以 o 结尾的字符串
	reg = regexp.MustCompile(`[^ ]{1,4}o`)
	fmt.Printf("%qn",-1))
	// ["Hello" "Go"]

	// 查找 Hello 或 Go
	reg = regexp.MustCompile(`(?:Hell|G)o`)
	fmt.Printf("%qn",-1))
	// ["Hello" "Go"]

	// 查找 Hello 或 Go,替换为 Hellooo、Gooo
	reg = regexp.MustCompile(`(?PHell|G)o`)
	fmt.Printf("%qn",reg.ReplaceAllString(text,"${n}ooo"))
	// "Hellooo 世界!123 Gooo."

	// 交换 Hello 和 Go
	reg = regexp.MustCompile(`(Hello)(.*)(Go)`)
	fmt.Printf("%qn","$3$2$1"))
	// "Go 世界!123 Hello."

	// 特殊字符的查找
	reg = regexp.MustCompile(`[ftnrv123x7Fx{10FFFF}^$.*+?{}()[]|]`)
	fmt.Printf("%qn",reg.ReplaceAllString("ftnrv123x7FU0010FFFF^$.*+?{}()[]|","-"))
	// "----------------------"
}

------------------------------------------------------------

阅读原文

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读