首页 > Golang 阅读数:20

Go语言正则表达式简介

正则表达式(regular expression)就是由元字符组成的一种字符串匹配的模式,使用这种模式可以实现对文本内容解析、校验、替换。

正则表达式经常应用在验证用户 ID、密码、身份证、手机号等是否符合格式要求。如果填写的内容与正则表达式不匹配,就可以断定内容是不符合要求或虚假的信息。

正则表达式还有其他重要的用途,就是模糊查询与批量替换。可以在文档中使用一个正则表达式来查找匹配的特定文字,然后或者将其删除,或者替换为别的文字。

正则表达式中的主要元字符如下表所示。

表:正则表达式主要元字符
格式 说明
\ 将下一个字符标记为一个特殊字符,或一个原义字符,或一个向后引用,或一个八进制转义值
^ 匹配输入字符串的开始位置。如果设置了 Regexp 对象的 Multiline 属性,^ 也匹配 \n 或 \r 之后的位置
匹配除 \n 之外的任何单个字符。要匹配包括 \n 在内的任何字符,请使用 [.\n]模式
$ 匹配输入字符串的结束位置。如果设置了 Regexp 对象的 Multiline 属性,$ 也匹配 \n 或 \r 之前的位置
x|y 匹配 x 或 y,| 代表“或”,例如,z|food 能匹配 z 或 food,(z|f)ood 则匹配 zood 或 food
* 匹配前面的了表达式 0 次或多次,zo* 匹配 z 以及 zoo,等价于{0, }
+ 匹配前面的子表达式 1 次或多次。zo+ 匹配 zo 以及 zoo,等价于{1, },代表最少有 1 个 o
匹配前面的子表达式 0 次或 1 次
{n} 例如,0{2} 匹配 food 中的两个 o
{n,m} 最少匹配 n 次、最多匹配 m 次
[xyz]  匹配所包含的任意一个字符。例如,[abc] 可以匹配 plain 中的 a
[^xyz] 负值字符集合。匹配未包含的任意字符。例如,[^abc]可以匹配 plain 中的 p
[a-z] 字符范围。匹配指定范围内的任意字符。例如,[a-z]可以匹配 a 到 z 范围内的任意小写字母字符
[^a-z] 负值字符范围。匹配不在指定范围内的任意字符。例如,[^a-z] 可以匹配任何不在 a 到 z 范围内的小写字母字符
\b 匹配一个单词边界,也就是指单词和空格间的位置。例如,er\b 可以匹配 never 中的 er,但不能匹配 verb 中的 er
\B 匹配非单词边界。er\B 能匹配 verb 中的 er,但不能匹配 never 中的 er
\cx 匹配由 x 指明的控制字符。例如,\cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一,否则,将 c 视为一个原义的 c 字符
\d 匹配一个数字。等价于 [0-9]
\D 匹配一个非数字。等价于[^0-9]
\f 匹配一个换页符。等价于 \x0c 和 \cL
\n 匹配一个换行符。等价于 \x0a 和 \cJ
\r  匹配一个回车符。等价于 \x0d 和 \cM
\s 匹配任何空白字符,包括空格、制表符、换页符等。等价于[\f\n\r\t\v]
\S 匹配任何非空白字符。等价于[^\f\n\r\t\v]
\t 匹配一个制表符。等价于 \x09 和 \cI
\v 匹配一个垂直制表符。等价于 \x0b 和 \cK
\w 匹配包括下画线的任何单词字符。等价于 [A-Za-20-9]
\W 匹配任何非单词字符。等价于 [^A-Za-20-9]
\num 匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,(.)\1 匹配两个连续的相同字符
\xn 匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,\x41 匹配 A。\x041 则等价干 \x04&1。正则表达式中可以使用 ASCII 编码
\un 匹配 n,其中 n 是一个用 4 个十六进制数字表示的 unicode 字符。例如,\u00A9 匹配版权符号 (?)
(pattern) 匹配括号内 pattern 所代表的表达式,是成组匹配
(?=pattern)  正向预查。例如,windows(?=95/98/2000/NT),含义是匹配 windows 后面可以是 95、98、2000 或者 NT
(?!pattern) 负向预查。例如,windows(?!95/98),含义是匹配 windows 后面不是 95 或 98 的其他字符串

正则表达式的特别备注说明如下。
  • 大写英文字母的正则表达式,除了可以写成 [A-Z],还可以写成 [\x41-\x5A]。因为在 ASCII 码字典中 A-Z 被排在了 65~90 号(也就是 ASCII 码的第 66 位到第 91 位),换算成十六进制就是 0x41-0x5A;
  • [0-9],可以写成 [\x30-\x39];
  • [a-z],可以写成 [\x61-\x7A];
  • 中文的正则表达式为:[\u4E00-\u9FA5]。

因为中文在 Unicode 编码字典中排在 4E00 到 9FA5。换成十进制,也就是第 19968 号到 40869 号是中文字,一共 20902 个中文字被收录到 Unicode 编码字典中。(第 19968 号是“一”,第 40869 号是“丂”,发音为yù)