话不多说,本文将带你进入正则表达式的大门 , 文末推荐超级好用的在线正则练习工具哦!!!
字符组 [ ]
允许匹配一组可能出现的字符 , 例如:
可以发现[Ll]既可以匹配大写的L也可以匹配小写的l
练习题:
利用字符组匹配多个单词: Java ,Jave , java , jave
区间 -
上面字符组匹配中,我们可以想下下面这道题,
为了解决这个问题, 在字符组中使用**连字符(-)代表区间 , **按照这个规则我们可以总结出:
- 匹配任意数字 [0-9]
- 匹配所有小写字母 [a-z]
- 匹配所有大写字母 [A-Z]
例如:
练习题: 利用区间匹配如下文本:
- abcdefg
- 012345678
- 987654321
- ABCDEFG
匹配特殊符号 \
有些情况下我们需要匹配 - . [ 等特殊字符,但是在正则表达式中,这些字符都需要经过转译,否则它将是正则的一部分,例如:
取反 ^
顾名思义,例如:
正则快捷方式 \w \d
上面我们学习匹配 0-9 或者 a-z 其实还有另一种快捷的表达, 如下:
快捷方式 | 描述 | |
---|---|---|
\w | 与任意单词字符匹配,任意单词字符表示 [A-Z]、 [a-z]、[0-9]、_ ... | |
\d | 与任意数字匹配 |
匹配空白 \s
\s 快捷方式可以匹配空白字符,比如空格,tab、换行等。
单词边界 \b
什么是边界?
边界 指的是占位的字符左右的间隙位置。
看了很多文章我都不知道怎么用白话来解释这段话,但是,你可以理解为,你看不到的间隙就属于边界。
就拿lynn这个单词来说,你能看到它总共占了四个位置,这是看的见的,但是,l 这个单词的左边有个看不见的缝隙,最后面的 n 这个单词也有个看不见的缝隙,这个就叫做边界, 有一句英文可以很好理解, 例如 :
这句话我们能看到的字符叫它占位字符, 包括空格在内有14个占位符, 如果我们想要匹配 m 这个字母, 在不加\b的情况下,会匹配到这段文本中的两个m, 这个毫无疑问,但是,如果我希望匹配到 第一个 m , 就需要加 \b 来限定了,因为单词边界的原因,第二个m无法被匹配中,那么为什么 第二个 m 就无法被匹配中呢? 又为什么第二个m 的右边就没有缝隙了呢?这就要说明了,正则中所说的单词指的是 \w 可以匹配的字符,即数字、大小写字母以及下划线 [0-9a-zA-Z_] 。
结论: 第一个m无论是左边还是右边的占位符都不能够被\w 匹配,而第二个m的右边是a,它可以被\w匹配。
例子:
以上例子,使用单词边界匹配到了lynn 这个单词,如果不使用\b 得到的结果将是三个文本中的lynn都能匹配:
快捷方式取反 \W \D
在前面我们使用过快捷方式匹配 \w \d 来匹配字母与数字,那如果不想匹配字母或者是数字,则可以使用 \W \D :
开始和结束 ^ $
在前面我们在字符组中使用过 ^ 来作为取反, 如果将^放在字符组外面,那它表示的则是 开始的意思:
任意字符 .
匹配除换行符之外的任何字符:
可选字符 ?
有时候我们希望匹配一个单词,这个单词的其中一个字母可有可无, 这时候可选字符就可以派上用场了:
它表示的是,出现 前面的字符 出现 0 或者 1 次。
重复匹配 {n}
如何匹配一个电话号码:
n 表示重复匹配多少次, \d 是我们前面所学的 匹配任意数字.
重复区间 {M,N}
可能有时候,我们不知道具体要匹配字符组要重复的次数,比如身份证有15位也有18位的。
这里重复区间就可以出场了,语法:{M,N},M是下界而N是上界。
例如:
\d{1,18} 既可以匹配15个数字也可以匹配18个数字,不过当有18个数字的时候,优先匹配的是18个数字,这是因为正则表达式默认是贪婪模式,即尽可能的匹配更多字符,而要使用非贪婪模式,我们要在表达式后面加上 ?号。
开闭区间 {1, }
有时候我们会遇到重复次数没有边界的情况,这时候使用开闭区间就可以实现:
上述例子表示,匹配15个数字以上的文本。
开闭区间速写模式 + *
使用 + 匹配1个到无数个,使用 *代表0个到无数个。
即:+等价于{1,},*等价于{0,}。
例子:
总结:
多种匹配模式
实例 | 描述 |
---|---|
[Ll]ynn | 匹配 “Lynn” 或 “lynn”。 |
[Jj]av[ae] | 匹配 “java” 或 “jave”。 |
[abcdef] | 匹配中括号内的任意一个字母。 |
[0-9] | 匹配任何数字。类似于 [0123456789]。 |
[a-z] | 匹配任何小写字母。 |
[A-Z] | 匹配任何大写字母。 |
[a-zA-Z0-9] | 匹配任何字母及数字。 |
[^au] | 除了au字母以外的所有字符。 |
[^0-9] | 匹配除了数字外的字符。 |
实例 | 描述 |
---|---|
. | 匹配除 “\n” 之外的任何单个字符。 |
? | 匹配一个字符零次或一次,另一个作用是非贪婪模式 |
+ | 匹配1次或多次 |
* | 匹配0次或多次 |
\b | 匹配一个长度为0的子串 |
\d | 匹配一个数字字符。等价于 [0-9]。 |
\D | 匹配一个非数字字符。等价于 [^0-9]。 |
\s | 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。 |
\S | 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。 |
\w | 匹配包括下划线的任何单词字符。等价于’[A-Za-z0-9_]’。 |
\W | 匹配任何非单词字符。等价于 ‘[^A-Za-z0-9_]‘。 |
正则在线练习工具: regexr-cn.com/