正则表达式的基本组成:普通字符和元字符。
普通字符:可以理解成常使用的数字和字母。
元字符:又称特殊字符,常用来表示一些特殊语义的字符,比如 ^、$ 等。
需要注意的是,特殊字符放置位置的不同,可以代表不同的语义,比如当 ^ 放在正则表达式首位时,表示以 ... 开始,当放在字符组([])的首位时,即[^],表示非。
例如:
(1) 匹配以 start 开始的字符串:
/^start/.test("start end");
// true
/^start/.test("please start");
// false
(2) 匹配非 a、b、c 以外字母:
/[^abc]/.test("a");
// false
/[^abc]/.test("b");
// false
/[^abc]/.test("m");
// true
正是由于元字符赋予了正则的模糊匹配,而不仅仅是精准匹配,所以才能构造出强大功能。
范围表示法,可以简写字符,只在字符组([])中有效。
例如:[7-9],表示是否含有7、8或者9中的任何一个
/[7-9]/.test("1234567");
// true
需注意,^ 放置不同位置,代表不同的意义。
当放在正则表达式首位(/^abc/),表示以 ... 开始,当放在字符组([])的首位时,即[^],表示非。例如:
字符串是否以7开始:
/^7/.test("1234567");
// false
字符串中是否含有非 7、8、9数字:
/[^789]/.test("789");
// false
/[^789]/.test("1789");
// true
用于匹配文本的末尾。
需注意,只有用于末尾,才具有结束符的意义。
例如,匹配一个必须以 world 结束的字符串:
/world$/.test("hello world");
// true
是一个可能匹配情况的集合,只会匹配一个字符。
当匹配时,只会匹配一个,但是匹配的这个字符可能是多个字符之中的一个。
例如:[abc]字符组,表示匹配的字符可能是a、b、c三者中的一个。
当字符组中字符非常多的时候,这个时候,我们可以通过范围表示法来简写。范围表示法,其实是通过一个连字符(-)来实现。比如:
[12345],我们可以简写成:[1-5]
但是,如果我们在匹配时,需要匹配连字符(-)时,怎么办呢?可以两种方式:
(1)通过转义字符,比如 [a\-c]
(2)可以把连接符(-)放在字符组的开头,或者结尾,只要让正则表达式匹配时,不是范围表达式功能就行,比如:[-ac]、[ac-]
可以在字符组的开头加上脱字符(^),表示非或者取反的意思。
比如,我想要匹配一个不是a、b的字符:
/[^ab]/;
简写 | 等价字符组 | 具体含义 |
---|---|---|
\d | [0-9] | 表示一位数字,值可能是0、1、2、3、4、5、6、7、8、9其中一个 |
|D | [^0-9] | 表示去除数字外的任意字符 |
\w | [0-9a-zA-Z_] | 表示单词字符(包含数字、大小写字母和下划线_) |
\W | [^0-9a-zA-Z_] | 表示非单词字符 |
. | [^u2028u2029] | 通配符,表示几乎任意字符。换行符、回车符、行分隔符和段分隔符除外 |
\s | 表示空白符(包括空格、水平制表符、垂直制表符、换行符、回车符、换页符) | |
\S | 非空白符 |
表示任意字符的表示方式:[\d\D]、[\w\W]、[\s\S]、[^]
正则表达式中的特殊字符转义通常通过在字符前添加反斜杠 \
来实现。
比如,由于 * 号在正则表达式中,表示至多0个以上,如果你想要匹配一个 * 号,需要在其前面添加 \
/\*/.test("*");
// true
分组是使用 ()
来表示的。
使用场景:
(1)对一个子表达式进行重复
比如,想要判断一个字符串中是否出现ab两次:
/(ab){2}/.test("abab")
// true
(2)获取子表达式匹配的内容
比如,有一个字符串 hello world
,我们想获取 world,我们可以这样处理:
/^hellos([\d\D]+)$/.exec("hello world")
// ["hello world", "world", index: 0, input: "hello world", groups: undefined]
当遇到去匹配10位长度的数字时,我们不可能写10个d,那么我们应该怎么处理呢?这个时候,就需要量词{m, n},表示出现至少m次,至多n次。
常用的一些量词:
量词 | 含义 |
---|---|
{m, n} | 至少m次,至多n次 |
{m, } | 至少m次,无上限 |
{m} | 相当于{m, m},表示出现m次 |
* | 相当于{0, },表示出现任意次数,也可以不出现 |
+ | 相当于{1, },表示至少出现一次,无上限 |
? | 相当于{0, 1},表示出现0次或者1次 |
例如,登录密码要求:长度至少6为,至多16位,只能取数字、大小写字母:
/^[A-Za-z0-9]{8,16}$/