基础知识 - 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 私人使用区 (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("%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\\^$.*+?{}()[]|", "-"))
- // "----------------------"
- }
- ------------------------------------------------------------
基础知识 - Golang 中的正则表达式的更多相关文章
- 基础知识 - Golang 中的格式化输入输出
------------------------------------------------------------ [格式化输出] // 格式化输出:将 arg 列表中的 arg 转换为字符串输 ...
- 学习Python3基础知识过程中总结
print()中end==""的用法 例子:用Python3输出九九乘法表: for i in range(1,10): for j in range(1,i+1): s=i*j ...
- 20151024_004_C#基础知识(C#中的访问修饰符,继承,new关键字,里氏转换,is 和 as,多态,序列化与反序列化)
1:C#中的访问修饰符 public: 公共成员,完全公开,没有访问限制. private: 私有的,只能在当前类的内部访问. protected: 受保护的,只能在当前类的内部以及该类的子类中访问. ...
- Java基础知识强化75:正则表达式之分割功能(字符串中的数字排序案例)
1. 案例分析: 我有如下一个字符串:"91 27 46 38 50" 写代码实现最终输出结果是:"27 38 46 50 91" 分析: (1)定义一个 ...
- Java基础知识强化78:正则表达式之获取功能(案例)
1. 获取下面这个字符串中由三个字符组成的单词. da jia ting wo shuo,jin tian yao xia yu,bu shang wan zi xi,gao xing bu? 2. ...
- Java基础知识强化76:正则表达式之替换功能
1. 替换功能: String类的replaceAll方法,如下: public String replaceAll(String regex, String replacement): 使用给定的r ...
- Java基础知识强化71:正则表达式之基本规则 和 常用正则表达式
1. 基本规则: A:字符 x 字符 x.举例:'a'表示字符a \\ 反斜线字符. \n 新行(换行)符 ('\u000A') \r 回车符 ('\u000D') B:字符类 [abc] a.b 或 ...
- Golang中的正则表达式
声明:文章转自GoLove 用法: 单一: . 匹配任意一个字符,如果设置 s = true,则可以匹配换行符 [字符类] 匹配"字符类"中的一个字符,"字符类" ...
- Java基础知识强化77:正则表达式之获取功能(Pattern 和 Matcher类的使用)
1. 获取功能: Pattern 和 Matcher类结合使用 2. 使用案例: package cn.itcast_05; import java.util.regex.Matcher; impor ...
随机推荐
- 第二百一十四天 how can I 坚持
今天肯定有需要记录的东西. html表格. table tr rd colspan rowspan, 还有呢.没了. 睡觉,明天石洋要来泛华. 睡觉.
- SQL SERVER安装提示“安装了 Microsoft Visual Studio 2008 的早期版本
工作共遇到的问题记录: 安装Sql Server 2008 R2时提示错误:“此计算机上安装了 Microsoft Visual Studio 2008 的早期版本.请在安装 SQL Server 2 ...
- $watch How the $apply Runs a $digest
作者:junyuecao | 发表于 8-8 13:39 | 最后更新时间:8-9 02:34 原文地址:http://angular-tips.com/blog/2013/08/watch-how- ...
- JAVA应用apache httpclient探测http服务
代码很简单,apache都已经提供了封装. import org.apache.commons.httpclient.HttpClient; import org.apache.commons.htt ...
- HDU 2196 Computer (树dp)
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=2196 给你n个点,n-1条边,然后给你每条边的权值.输出每个点能对应其他点的最远距离是多少 ...
- CCF 201403-3 命令行选项 (STL模拟)
问题描述 请你写一个命令行分析程序,用以分析给定的命 令行里包含哪些选项.每个命令行由若干个字符串组成,它们之间恰好由一个空格分隔.这些字符串中的第一个为该命令行工具的名字,由小写字母组成,你的程序 ...
- C#图解教程读书笔记(第1章 C#和.net框架)
C#中的主要需要记住的基础概念 CLR公共语言运行库 CIL中间语言,所有的代码都会编译成中间语言. CLI公共语言基础结构 C#的优点 C#有自动垃圾回收机制
- centOS安装openoffice
centOS安装openoffice的方法: yum install openoffice.org-writer yum install openoffice.org-calc yum install ...
- sql server对并发的处理-乐观锁和悲观锁【粘】
假如两个线程同时修改数据库同一条记录,就会导致后一条记录覆盖前一条,从而引发一些问题. 例如: 一个售票系统有一个余票数,客户端每调用一次出票方法,余票数就减一. 情景: 总共300张票,假设两个售票 ...
- js时间转换相关
1.json时间格式转换 function ChangeDateFormat(jsondate) { if (!jsondate||jsondate.length < 1) {return &q ...