浅析正则表达式

186 阅读2分钟

什么是正则表达式

我们在程序/网页中有时可能会处理一些复杂规则的字符串,那么我们就会需要用到正则表达式,他可以帮助我们快速的找到符合某些规则的文本。

正则表达式测试工具

www.regexpal.com/

元字符

元字符是一组代替一个或多个字符的字符

代码说明
.匹配除换行符以外的任意字符
\w匹配字母或数字或下划线或汉字
\s匹配任意的空白符
\d匹配数字
\b匹配单词的开始或结束
匹配字符串的开始
$匹配字符串的结束

上面的代码中,\b ^ 和 $ 有点特殊,他们都是匹配一个位置。 例如

/^\d{5,7}$/

表示一个5-7位的数字字符串

字符转义

当你想要在查找 \ . ^ 等元字符时,如果直接使用就会出问题。 此时,我们需要使用转义字符 \

\. 表示 .
\^ 表示 ^
\\ 表示 \

重复

代码说明
*重复零次或更多次
+重复一次或更多次
?重复零次或一次
{n}重复n次
{n,}重复n次或更多次
{n,m}重复n到m次
/^\d+/ 表示匹配字符串开头的一个或多个数字

/^\d{2,5}/ 表示匹配字符串开头的 2-5长度 的数字

字符类

通过上面的元字符,我们想要匹配字母/数字等常见的文本是比较容易的了,那么,如果我们想要匹配一些自定义的文本呢?

这时候我们就需要 [] 了。

例如 [0-9] 相对于 \d , [a-z0-9A-Z] 几乎相当于 \w

分枝条件

分支条件用于书写多种规则,如果满足其中任意一种规则,那么都会被匹配。

\d{5}-\d{4}|\d{5}

上面的代码用于匹配 5个数字-4个数字 或者 5个数字

需要注意的是,分支条件如果满足一个,那么另一个条件是不会再匹配了

反义

如果我们需要匹配除了某几个字符以外的字符,那么就需要用到反义

代码说明
\W匹配任意不是字母,数字,下划线,汉字的字符
\S匹配任意不是空白符的字符
\D匹配任意非数字的字符
\B匹配不是单词开头或结束的位置
[^x]匹配除了x以外的任意字符
[^aeiou]匹配除了aeiou这几个字母以外的任意字符

分组

通过 + * ? 我们可以匹配单个的重复的字符,但是如果想要匹配多个字符,那么,我们就需要进行分组,在指定重复的次数

例如

(\d{1-3}\.){3}\d{1,3}

它可以匹配一个类似于ip地址形式的字符。

分类代码说明
捕获(exp)匹配exp,并捕获文本到自动命名的组里
捕获(?<name>exp)匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)
捕获(?:exp)匹配exp,不捕获匹配的文本,也不给此分组分配组号
零宽断言(?=exp)匹配exp前面的位置
零宽断言(?<=exp)匹配exp后面的位置
零宽断言(?!exp)匹配后面跟的不是exp的位置
零宽断言(?<!exp)匹配前面不是exp的位置

后向引用

默认情况下,每个分组都会有一个组号,规则是:从左到右,从1开始,以此类推。

后向引用用户重复搜索前面的某个分组。 例如

\b(\w+)\b\s+\1\b

它可以用来重复匹配单词,例如 hello hello 其中的 \1 就是前面的(\w+)。

零宽断言

零宽断言是类似与 ^ $ \b ,他是仅仅匹配一个位置。

零宽度正预测先行断言,他是用于匹配分组前面那个位置的字符。

\b\w+(?=tion\b)

那么,他就只能匹配到 action 中的 ac

零宽正回顾后发断言,他是用于匹配分组后面出现的字符的。

(?<=ac)\w\b

那么,他就只能匹配带 action 中的 tion

(ps:这是谁起的名字啊。。。。。)

负向零宽断言

负向零宽断言类似于 反义,我们用它来保证之前/之后没有出现某个字符。

零宽度负预测先行断言 用于匹配一个位置,那个位置后面不能出现分组内的字符

[a-z]+(?!\d)

例如上面的代码表示匹配一个会多个小写字母,但是后面不能有数字

零宽度负回顾后发断言 用于匹配一个位置,那个位置前面不能出现分组内的字符

(?<!/d)[a-z]+

上面的代码用于匹配一个前面不能有数字的一个多多个小写字母