跳转至

正则表达式的分类

  • 基本的正则表达式(Basic Regular Expression 又叫Basic RegEx 简称BREs)
  • 扩展的正则表达式(Extended Regular Expression 又叫Extended RegEx 简称EREs)
  • Perl的正则表达式(Perl Regular Expression 又叫Perl RegEx 简称PREs)

[]符号匹配字符集合,支持穷举方法匹配字符集合的所有元素也支持使用-符号表示集合范围,^符号在[]中表示取反

基本正则表达式

正则表达式 描述 示例 Basic RegEx Extended RegEx Python Reg
\ 转义符,将特殊字符进行转义,忽略其特殊意义 a.b匹配a.b,但不能匹配ajb,.被转义为特殊意义 \ \ \
^ 匹配行首,awk中,^则是匹配字符串的开始 ^tux匹配以tux开头的行 ^ ^ ^
$ 匹配行尾,awk中,$则是匹配字符串的结尾 tux$匹配以tux结尾的行 $ $ $
. 匹配除换行符\n之外的任意单个字符,awk则中可以 ab.匹配abc或bad,不可匹配abcd或abde,只能匹配单字符,但同一个正则可使用多个来匹配多个字符 . . .
[] 匹配包含在[字符]之中的任意一个字符 coo[kl]可以匹配cook或cool [] [] []
[^] 匹配[^字符]之外的任意一个字符 123[^45]不可以匹配1234或1235,1236、1237都可以 [^] [^] [^]
[-] 匹配[]中指定范围内的任意一个字符,要写成递增 [0-9]可以匹配1、2或3等其中任意一个数字 [-] [-] [-]
? 匹配之前的项1次或者0次 colou?r可以匹配color或者colour,不能匹配colouur 不支持 ? ?
+ 匹配之前的项1次或者多次 sa-6+匹配sa-6、sa-666,不能匹配sa- 不支持 + +
* 匹配之前的项0次或者多次 co*l匹配cl、col、cool、coool等 * * *
() 匹配表达式,创建一个用于匹配的子串 matri?匹配max或maxtrix 不支持
{n} 匹配之前的项n次,n是可以为0的正整数 [0-9]{3}匹配任意一个三位数,可以扩展为[0-9][0-9][0-9] 不支持 {n} {n}
{n,} 之前的项至少需要匹配n次 [0-9]{2,}匹配任意一个两位数或更多位数 不支持 {n,} {n,}
{n,m} 指定之前的项至少匹配n次,最多匹配m次,n<=m [0-9]{2,5}匹配从两位数到五位数之间的任意一个数字 不支持 {n,m} {n,m}
| 交替匹配|两边的任意一项 abc d匹配abc或abd 不支持

**POSIX字符类**可以使用语法[:CLASS:]在方括号内指定字符类,其中CLASS在POSIX标准中定义并具有其中一个值 例如:ls -ld [[:digit:]]* # 匹配以数字命名的文件夹

正则表达式 描述 示例 Basic RegEx Extended RegEx Python Reg
[:alnum:] 匹配任意一个字母或数字字符 [[:alnum:]]+ [:alnum:] [:alnum:] [:alnum:]
[:alpha:] 匹配任意一个字母字符(包括大小写字母) [[:alpha:]]{4} [:alpha:] [:alpha:] [:alpha:]
[:blank:] 空格与制表符(横向和纵向) [[:blank:]]* [:blank:] [:blank:] [:blank:]
[:digit:] 匹配任意一个数字字符 [[:digit:]]? [:digit:] [:digit:] [:digit:]
[:lower:] 匹配小写字母 [[:lower:]]{5,} [:lower:] [:lower:] [:lower:]
[:upper:] 匹配大写字母 [[:upper:]]+? [:upper:] [:upper:] [:upper:]
[:punct:] 匹配标点符号 [[:punct:]] [:punct:] [:punct:] [:punct:]
[:space:] 匹配一个包括换行符、回车等在内的所有空白符 [[:space:]]+ [:space:] [:space:] [:space:]
[:graph:] 匹配任何一个可以看得见的且可以打印的字符 [[:graph:]] [:graph:] [:graph:] [:graph:]
[:xdigit:] 任何一个十六进制数(即:0-9,a-f,A-F) [[:xdigit:]]+ [:xdigit:] [:xdigit:] [:xdigit:
[:cntrl:] 任何一个控制字符(ASCII字符集中的前32个字符 [[:cntrl:]] [:cntrl:] [:cntrl:] [:cntrl:]
[:print:] 任何一个可以打印的字符 [[:print:]] [:print:] [:print:] [:print:]

元字符(meta character)是一种Perl风格的正则表达式,只有一部分文本处理工具支持它,并不是所有的文本处理工具都支持

正则表达式 描述 示例 Basic RegEx Extended RegEx Python Reg
\b 单词边界 \bcool\b 匹配cool,不匹配coolant \b \b \b
\B 非单词边界 cool\B 匹配coolant,不匹配cool \B \B \B
\d 单个或更多连续的数字 b\db 匹配b2b,不匹配bcb 不支持 不支持 \d
\D 单个非数字字符 b\Db 匹配bcb,不匹配b2b 不支持 不支持 \D
\w 单个单词字符(字母、数字与_) \w 匹配1或a,不匹配& \w \w \w
\W 匹配任意不是字母,数字,下划线,汉字的字符 \W 匹配&,不匹配1或a \W \W \W
\n 换行符 \n 匹配一个新行 不支持 不支持 \n
\s 单个空白字符 x\sx 匹配x x,不匹配xx 不支持 不支持 \s
\S 单个非空白字符 x\S\x 匹配xkx,不匹配xx 不支持 不支持 \S
\r 回车 \r 匹配回车 不支持 不支持 \r
\t 横向制表符 \t 匹配一个横向制表符 不支持 不支持 \t
\v 垂直制表符 \v 匹配一个垂直制表符 不支持 不支持 \v
\f 换页符 \f 匹配一个换页符 不支持 不支持 \f

**后向引用**用于重复搜索前面某个分组匹配的文本,exp(expression)代表表达式,常用分组语法如下: | 代码/语法 | 说明 | | :------: | :------: | | [^x] | 匹配除了x以外的任意字符 | | [^aeiou] | 匹配除了aeiou这几个字母以外的任意字符 |

常用正常表达式

Text Only
以汉字开头的行:^[\u4e00-\u9fa5]    详解:[\u4e00-\u9fa5]代表任何一个汉字--原理:U4300-U9fa5代表了符合汉字GB18030规范的字符集

匹配至少一个汉字:[\u4E00-\u9FA5]+

空行的表示方法:^$ 或:\n[\s|]*\r

匹配包含一个字符的行:^.$

匹配不在b~d范围的字符:[^b-d]

匹配除了x以外的任意字符:[^x]

匹配所有英文单词:[A-Za-z][A-Za-z]*

精确匹配字符(例如精确匹配单词the,不匹配包含the的单词,如them,they等):\<the\>

匹配前面的字符重复n次的字符:\{n\}

例如匹配值jooob:jo\{3\}b

匹配前面的字符至少出现n次的字符:\{n,\}

例如:jo\{3,\}b #jooob、joooob等字符都由此正则表达式匹配

匹配前面的字符出现n~m次的字符:\{n,m\}

例如:jo{3,6\}  #匹配jooob、joooooob等字符,至少3次,最多6次

精确匹配5个小写字符:[a-z]\{5\} #如hello、house等5个小写单词或字符

匹配job或joob:jo?b

+符号和×符号类似,匹配其前面的字符多次,但是×可以匹配0次,而+至少要匹配1次:jo+b表示:joob、jooob等字符,job不能用此来匹配

()和|符号组合使用,表示一组可选字符的集合:re(a|e|o)d表达式中的(a|e|o)表示:在字符a、e、o中任意选择一个字符,即read、reed、reod都可以由此表达式匹配
()很少使用,因为[]符号可以完全替代,re(a|e|o)d等价于re[aeo]d

非负整数:^\d+$

正整数:^[0-9]*[1-9][0-9]*$

非正整数:^((-\d+)|(0+))$

负整数:^-[0-9]*[1-9][0-9]*$

整数:^-?\d+$

非负浮点数:^\d+(\.\d+)?$

正浮点数:^((0-9)+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)$

非正浮点数:^((-\d+\.\d+)?)|(0+(\.0+)?))$

负浮点数:^(-((正浮点数正则式)))$

英文字符串:^[A-Za-z]+$

英文大写串:^[A-Z]+$

英文小写串:^[a-z]+$

英文字符数字串:^[A-Za-z0-9]+$

英数字加下划线串:^\w+$

E-mail地址:^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$ 或:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

URL:^[a-zA-Z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\s*)?$
或:^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$

邮政编码:^[1-9]\d{5}$

中文字符:^[\u0391-\uFFE5]+$

电话号码:^((\(\d{2,3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}(\-\d{1,4})?$

手机号码:^((\(\d{2,3}\))|(\d{3}\-))?13\d{9}$

双字节字符(包括汉字在内):^\x00-\xff

匹配首尾空格:(^\s*)|(\s*$)(像vbscript那样的trim函数)

匹配HTML标记:<(.*)>.*<\/\1>|<(.*)\/>

提取信息中的网络链接:(h|H)(r|R)(e|E)(f|F)*=*('|")?(\w|\\|\/|\.)+('|"|*|>)?

提取信息中的邮件地址:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* 或 [a-zA-Z0-9\-_+]+@[A-Za-z]+\.(com|cn|net)

提取信息中的图片链接:(s|S)(r|R)(c|C)*=*('|")?(\w|\\|\/|\.)+('|"|*|>)?

提取信息中的IP地址:(\d+)\.(\d+)\.(\d+)\.(\d+) 或:((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?) 或:^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$

提取信息中的中国手机号码:(86)*0*13\d{9}

提取信息中的中国固定电话号码:(\(\d{3,4}\)|\d{3,4}-|\s)?\d{8}

提取信息中的中国电话号码(包括移动和固定电话):(\(\d{3,4}\)|\d{3,4}-|\s)?\d{7,14}

提取信息中的中国邮政编码:[1-9]{1}(\d+){5}

提取信息中的浮点数(即小数):(-?\d*)\.?\d+

提取信息中的任何数字:(-?\d*)(\.\d+)?

电话区号:/^0\d{2,3}$/

腾讯QQ号:^[1-9]*[1-9][0-9]*$

帐号(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$

中文、英文、数字及下划线:^[\u4e00-\u9fa5_a-zA-Z0-9]+$

sql语句:^(select|drop|delete|create|update|insert).*$

匹配行首空格:^\s*

匹配行尾空格:\s*$

\< 匹配词首

> 匹配词尾

\b 匹配单词边界

对比如下:

Bash
line="cat dog sky"
echo "$line" | sed -n "s/\(.*\)\b\(.*\)/# |\1|\2|/p"
echo "$line" | sed -n "s/\(.*\)\>\(.*\)/# |\1|\2|/p"
echo "$line" | sed -n "s/\(.*\)\<\(.*\)/# |\1|\2|/p"
echo
line="cat  dog  sky"
echo "$line" | sed -n "s/\(.*\)\b\(.*\)/# |\1|\2|/p"
echo "$line" | sed -n "s/\(.*\)\>\(.*\)/# |\1|\2|/p"
echo "$line" | sed -n "s/\(.*\)\<\(.*\)/# |\1|\2|/p"
echo
line="cat  dog  sky  "
echo "$line" | sed -n "s/\(.*\)\b\(.*\)/# |\1|\2|/p"
echo "$line" | sed -n "s/\(.*\)\>\(.*\)/# |\1|\2|/p"
echo "$line" | sed -n "s/\(.*\)\<\(.*\)/# |\1|\2|/p"
echo

# 输出分别是:
# |cat dog |sky|
# |cat dog| sky|
# |cat dog |sky|

# |cat  dog  |sky|
# |cat  dog|  sky|
# |cat  dog  |sky|

# |cat  dog  sky|  |
# |cat  dog  sky|  |
# |cat  dog  |sky  |