掌握正则表达式(2)基础篇(一)

2018-04-07  本文已影响42人  redexpress

参考

这是我讲述正则表达式的“教案”,你也可以用来作为正则表达式手册。

正则表达式

1. 基本字符

说明:本文在表述正则表达式时,用方框扩起来的字符(示例:x)表示具体的字符,而不用方框扩起来的字符,表示一类字符,比如用“x”表示一个字符,并不一定是x

正则表达式 匹配 说明
x 字符x 匹配一个字符,区分大小写,示例:a匹配字符aA匹配字符A7匹配字符7

注意:编程语言的正则表达式默认是区分大小写的,而编辑器默认不区分大小写。

基本字符能直接匹配,有些字符为特殊字符,在正则表达式里有特殊意义,不能直接匹配。比如.并不是匹配.而是可以匹配多个字符。正则表达式里一个字符可以表示多种意义,比如7可以匹配字符7,在不同的位置,也可以有其它意义。这些在后文都会讲到。

2. 转义字符

说明:本文在表述正则表达式时,用方框扩起来的字符(示例:x)表示具体的字符,而不用方框扩起来的字符,表示一类字符,比如用“x”表示一个字符,并不一定是x

正则表达式 匹配 说明
x 字符x 匹配一个字符,区分大小写,示例:a匹配字符aA匹配字符A7匹配字符7
\\ 字符\
\0nnn 一个字符的ASCII码是八进制值nnn \0开头,最多3位8进制,示例:\0101匹配字符A\09表示Tab键
\xhh 一个字符的ASCII码是十六进制值hh \x开头,最多2位16进制,示例:\04E\04e匹配字符N
\t tab字符 等同\x09
\n 换行符 等同\x0a
\r 回车符 等同\x0d
\a 响铃符 等同\x07
\e escape字符 等同\x1b

重要说明:字符串内反斜杠\ 在常见的编程语言里都要转义"\\",而正则表达式里斜杠也要转义。就存在两次转义的问题。

比如正则表达式"\\\\"在编程语言里匹配字符\,因为四个反斜杠"\\\\"在字符串内,其实只表示两个反斜杠,正则表达式两个反斜杠表示字符\

Python编程语言的r字符串不需要转义,re.match(r'\\', '\\') 等同re.match('\\\\', '\\')学习正则表达式比较方便。

上面表格内并没有包括所有转义字符,后文会继续补充。

3.匹配多次

正则表达式a表示匹配字符a,如果要匹配字符aa,用正表达式aa,如果匹配100个a呢,可以用a{100},更多情况见下表

正则表达式 匹配 说明
x{n,m} n到m个x字符 n和m为自然数,m≥n
x{n,} n个以上x字符
x{n} n个x字符 等价{n,n}
x+ 1个以上x字符 等价x{1,}
x? 0个或1个x字符 等价x{0,1}
x* 0个或多个x字符 等价x{0,}

上面的表格出现了几个新的字符{},+?*

其中{},如果不是用作范围限定符,在不引起混淆的情况下可不转义,可以直接匹配这些字符。但要匹配这些字符本身+?*就要转义。如下表:

正则表达式 匹配 说明
\} } 不引起混淆的情况可不转义
\{ } 不引起混淆的情况可不转义
\, , 不引起混淆的情况可不转义
\+ +
\? ?
\* *

4. 正则表达式的流派(flavor)

类Unix操作系统的很多命令是支持正则表达式的,比如grep命令。

我们在macOS终端输入下面的命令:

echo aaaa|grep 'a{4}'

并不能够匹配。

改成这样:

echo aaaa|grep 'a\{4\}'

就可以匹配。

这是什么原因呢?这是因为grep命令的正则表达式花括号表示的意义和上文所讲的是相反的。即:}表示字符本身,用作范围符号需要转义\}

同一个正则表达式在不同的工具、编程语言表示的意义不同,这种现象叫做正则表达式的流派问题。

这个教程是什么流派呢?Perl 5流派,Perl 5.0版出现的早,而且正则表达式支持强大,很多编程语言实现都以此标准。

正则表达式的流派问题,会导致你在一个环境测试通过的正则表达式,在另一个环境可能不适用。所以移植正则表达式时一定要充分测试。

相关文章

掌握正则表达式(1)工具篇

上一篇 下一篇

猜你喜欢

热点阅读