正则表达式
什么是正则表达式?
正则表达式就是用来描述字符串格式的规则。
在表单验证中经常需要使用正则表达式。
例如,注册一个账户,需要填写邮箱地址,那你如何判断用户输入的是邮箱格式呢?
自然,用循环和判断一定可以写出完整的检测逻辑,但是真的很难很难。
如果使用正则表达式就会简单得多。
我们只需要按邮箱格式,写出邮箱格式的正则描述即可。
正则对象的创建:
1:let re = /正则表达式/;(perl风格的正则,最常用)
2:let re = new RegExp(); (构造方法,工作中不用)
一 正则的书写
正则书写最主要的两个部分:范围和数量.
范围指的是:都是些什么字符.
数量指的是:有多少个.
因此正则描述的总是:什么什么字符有多少个这样的事情。
1.1 范围
指定的字符和指定范围的字符。
指定的字符就直接写出对应的字符即可。
指定的范围字符需要写[].
// 这个正则表示的是:一个a字符.
let re = /a/;
// 这个正则表示的是:在一起的ab字符.
let re = /ab/;
// 这个正则表示的是:一个a或者一个b字符.
let re = /[ab]/;
let re = /[a|b]/;
// 这个正则表示的是:一个a-z之间的字符.
let re = /[a-z]/
// 这个正则表示的是:数字19.
let re = /19/;
// 这个正则表示的是:1或者9.
let re = /[19]/;
// 这个正则表示的是:0-9.
let re = /0-9/;
// 小写的a-z或者大写的A-Z
let re = /[a-zA-Z]/;
let re = /[a-z|A-Z]/;
// 除了小写a-z
let re = /[^a-z]/;
1.2 数量
数量都需要写在{}中,需要些在范围后面.
如果数量是不确定的,需要用,(逗号)隔开.
// 一个a
let re = /a{1}/;
// 一个a或者b
let re = /[ab]{1}/;
// 两个a
let re = /a{2}/;
// 1到3个a
let re = /a{1,3}/;
// 0到1个a (a可有可无)
let re = /a{0,1}/;
// 最少1个a,最多不限
let re = /a{1,}/;
// 最少0个a,最多不限.(可以没有,有又可以有很多个)
let re = /a{0,}/;
1.3 简写
正则之所以难,就是采用了大量的简写.
范围的简写:
[0-9] 可以简写为 \d (数字)
[a-zA-Z0-9_]可以简写为 \w (英文数字和下划线)
\s => 表示空格
. => 表示任意字符. (注意, 反斜杠.表示点)
\D => 表示非数字
\W => 非英文数字和下划线
\S => 非空格
数量的简写
{1} 可以省略
{1,} 简写为 +
{0,1} 简写为 ?
{0,} 简写为 *
1.4 修饰符
正则有两个常用修饰符,i和g
i => 区分大小写
g => 全局匹配
// 以下表示全局比配,不区分大小写的a-z英文字母.
let re = /[a-z]/ig;
1.5 位置的正则
有时候相同的字符,出现在不同的位置,为了区分它们,需要描述它们各自的位置.(难)
1.5.1 行首:^
1.5.2 行尾:$
// 行首的a
let re = /^a/;
// 行尾的a
let re = /a$/;
// 行首是a行尾是b的ab.
let re = /^ab$/;
1.5.3 预查:
正向肯定预查: ?= (后面是)
正向否定预查: ?! (后面不是)
反向肯定预查: ?<= (前面是)
反向否定预查: ?<! (前面不是)
注意,预查写法都应该些在 ()内
// 这个字符有两个a.可以通过行首行尾的a来区分它们.还可以通过预查来区分.
let str = 'aba';
// 后面是b的a
let re = /a(?=b)/;
// 后面不是b的a
let re = /a(?!b)/;
// 前面是b的a
let re = /(?<=b)a/;
// 前面不是b的a
let re = /(?<!b)a/
1.5.4 单词边界
js正则中的单词就是 \w,非单词就是 \W
\b => 单词边界,意即单词和非单词之间的位置。也包括单词和行首行尾之间的位置。
\B => 非单词边界,意即单词和单词之间的位置。
let re = /\B/g;
'abc'.replace(re,'*'); // "a*b*c"
let re = /\b/g;
'ab$c'.replace(re,'*'); // "*ab*$*c*"