RegEx101 正则入门笔记 #

正则表达式的两种基本用途:搜索和替换。给定一个正则表达式,它要么匹配一些文本(进行一次搜索),要么匹配并替换一些文本(进行一次替换)。


匹配单个字符 #

正则表达式,也被称为模式,其实是一些由字符构成的字符串。这些字符可以是字面字符(普通文本)或元字符(有特殊含义的字符)。

普通文本

任意字符

注意正则表达式使用字符串内容来匹配模式。匹配到的未必总是整个字符串,也可能是与某个模式相匹配的子串。在上面的例子里,我们使用的正则表达式并不能匹配完整的文件名, 而是只匹配了其中一部分。如果你需要把某个正则表达式的匹配结果传递到其他代码或应用程序里做进一步处理,就必须记住这种差异。

特殊字符

.a.\.
结果:na1.xls

第一个.匹配a前面的单个字符;第二个.匹配a后面的单个字符;\.作为转义匹配真正的.符号

匹配一组字符 #

在正则表达式里,我们可以使用元字符 [ 和 ] 来定义一个字符集合。在使用 [ 和 ] 定义的字符集合里,出现在 [ 和 ] 之间的所有字符都是该集合的组成部分,必须匹配其中某个成员(但并非全部)。

利用字符集合区间

一些合法的字符区间:

字符区间的首、尾字符可以是 ASCⅡ字符表里的任意字符。但在实际工作中,最常用的字符区间还是数字字符区间和字母字符区间。

注意 -(连字符)是一个特殊的元字符,它只有出现在 [ 和 ] 之间的时候才是元字符。在字符集合以外的地方,- 只是一个普通字符,只能与 - 本身相匹配。因此,在正则表达式里,- 字符不需要被转义。

在同一个字符集合里可以给出多个字符区间。比如说,下面这个模式可以匹配任何一个字母(无论大小写)或数字,但除此以外的其他字符(既不是数字也不是字母的字符)都不匹配:

[A-Za-z0-9]==
[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789]

排除

字符集合通常用来指定一组必须匹配其中之一的字符。但在某些场合,我们需要反过来做,即指定一组不需要匹配的字符。换句话说,就是排除字符集合里指定的那些字符。

[^0-9]这种用法就恰好与[0-9]相反

小结

元字符 #

转义字符

因为元字符在正则表达式里有着特殊的含义,所以这些字符就无法用来代表它们本身。比如说,你不能使用 [ 来匹配 [ 本身,也不能使用 . 来匹配 . 本身。

匹配空白字符

匹配特定字符类型

数字元字符

匹配字母数字(与非字母数字)

匹配空白字符

匹配十六进制或八进制数值

POSIX 字符类

POSX 是一种特殊的标准字符类集,也是许多(但不是所有)正则表达式实现都支持的一种简写形式。

重复匹配 #

目的是要匹配尽可能多的字符。可以通过几种特殊的元字符实现。

匹配一个或多个字符

注意你可能已经注意到了:我们没有对字符集合 [\w.] 里的.字符进行转义,但依然能够匹配.字符。一般来说,当在字符集合里使用的时候,像.和+这样的元字符将被解释为普通字符,不需要转义,但转义了也没有坏处。[\w\.] 的使用效果与 [w\.] 是一样的。

匹配零个或多个字符

匹配零个或一个字符

匹配的重复次数

为了解决这些指定重复的问题并对重复性匹配有更多的控制权,正则表达式允许使用重复范围(interval)。重复范围在 { 和 } 之间指定。

区间范围

{} 语法还可以用来为重复匹配次数设定一个区间范围,也就是匹配的最小次数和最大次数。

匹配至少重复多少次

指定至少要匹配多少次(不指定最大匹配次数) 。这种用法的语法类似于区间范围语法,只是省略了最大值部分而已。

防止过度匹配

? 的匹配范围有限(仅限零次或一次匹配) ,当使用精确数量或区间时,重复范围匹配也是如此。但其他重复匹配形式在重复次数方面都没有上限值,而这样做有时会导致过度匹配的现象。

位置匹配 #

单词边界

字符串边界