什么是正则表达式
我们在程序/网页中有时可能会处理一些复杂规则的字符串,那么我们就会需要用到正则表达式,他可以帮助我们快速的找到符合某些规则的文本。
正则表达式测试工具
元字符
元字符是一组代替一个或多个字符的字符
| 代码 | 说明 |
|---|---|
| . | 匹配除换行符以外的任意字符 |
| \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]+
上面的代码用于匹配一个前面不能有数字的一个多多个小写字母