正则表达式
正则表达式进阶玩法
正则表达式(regular Experssion : RegExp)
用来处理字符串的规则
- 只能处理字符串
- 他是一个规则,可以验证字符串是否符合某个规则(test),也可以把字符串中符合规则的内容捕获到(exec / match…)
编写正则表达式
- 第一种方式:
- 字面变量创建方式(两个斜杠之间包起来的,都是用来描述规则的元字符。
-
let reg = /\d+/;
- 第二种方式
- 构造函数模式创建,两个参数 ,元字符字符串 和 修饰符字符串
-
let reg2 = new RegExp("\d+");
- 正则表达式由两部分组成
- 元字符和修饰符
元字符 | ||
特殊元字符 | \d | 0~9任意一个数字 |
\D | 非0~9之间的任意字符 | |
\w | 字母、数字或下划线 [a-z 、A-Z 、0-9 、_ ] | |
\W | 非字母、数字或下划线 | |
\s | 匹配任意一个空白字符 (包括空格、制表符、换页符) | |
\b | 匹配边界符 "hello-world" (每个单词旁边字符) | |
\n | 匹配一个换行符 | |
\ | 转义字符 ,( \. 只表示一个小数点) | |
. | 表示除了\n之外的任意字符 | |
^ | 以某个字符开头 | |
$ | 以某个字符结尾 | |
\t | 一个制表符(一个TAB键,四个空格) | |
a|b | a或者b任意一个 | |
[abc] | a或b或c任意一个 | |
[^abc] | 除了a\b\c之外的 | |
[a-z] | 表示a到z中任意一个字母 | |
[0-9] | [0-9] 等价于 \d, 但 是 只 能 写 0—9 之 间 的 数,如果是【12,35】就不能行。 | |
[^a-z] | 表示除了a到z中任意一个字母 | |
() | 分组 | |
(?:) | 当前分组只匹配不捕获 | |
(?=) | 正向预查 | |
(?!) | 反向预查 | |
量词元字符 | * | 出现零到多次 |
? | 出现零次 或 一次 | |
+ | 出现一次到多次 | |
{m} | 出现 m 次 | |
{m,} | 出现至少 m 次 | |
{m,n} | 出现 m~n 次 | |
普通元字符 | 除上述之外的字符 |
修饰符 | ||
i | ignoreCase 忽略大小写 | |
g | global 全局匹配 | |
m | multiline 多行匹配 |
MDN的正则介绍
这里先介绍一种汉字的正则编码
- /[\u4e00-\u9fa5]/ (二十年前的表达式【放弃吧】)
- /\p{Unified_Ideograph}/u(【2020年之后就用它】)
正则表达式的应用
有效数字的验证
//可能出现 + - ,也可能不出现。
//一位时0-9都可以,多位时,第一位不能为0
//小数部分可能没有,也可能有。
// let reg = /^[+-]?(\d|([1-9]\d+))(\.\d+)?$/;
//科学计数法的正则表达式
//let reg1 = /^[+-]?(\d|([1-9]\d+))([.]\d+)?([Ee][+-]?\d+)?$/;
密码验证
//数字、字母或下划线
//6-16位
// let reg = /^\w{6,16}$/;
验证真实姓名
// 姓名
// 名字长度为2-10
// 可能有译名·汉字
// let reg = /^\p{Unified_Ideograph}{2,10}(·\p{Unified_Ideograph}{2,10}){0,5}$/u;
验证邮箱
//开头是数字、字母或下划线
// 1、纯数字 123456@qq.com
// 2、纯字母 zhangsan@qq.com
// 3、字母数字混合 zhang123@qq.com
// 4、带点的 zhang.san@qq.com
// 5、带下划线 zhang_san@qq.com
// 6、带连接线 zhang-san@qq.com
// 7、多个后缀 123456@vip.qq.com
// var reg = /^\w+((-\w+)|(\.\w+))*@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/;
身份证号码验证
新的18位身份证号码各位的含义:
1-2位省、自治区、直辖市代码;
3-4位地级市、盟、自治州代码;
5-6位县、县级市、区代码;
7-14位出生年月日,比如19670401代表1967年4月1日;
15-17位为顺序号,其中17位男为单数,女为双数;
18位为校验码,0-9和X,由公式随机产生。
//十五位身份证号
// let reg = /^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{2}$/;
//十八位身份证号
// let reg = /^([1-9]\d)(\d{2})(\d{2})([1-9]\d{3})(\d{2})(\d{2})(\d{2})(\d)([0-9Xx])$/;
// 十五位身份证号和十八位身份证号整合
// var reg = /(^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$)|(^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{2}$)/;
正则表达式的创建方式的区别
构造函数因为传递的是字符串,\ 需要写两个才代表斜杠
let = /\d+/g;
reg = new RegExp("\\d+","g");
正则表达式中的部分内容是变量存储的值
- 两个斜杠之间包起来的都是元字符。(如果正则中要包含某个变量的值,则不能使用自面量方式创建。)
- 这种情况只能使用构造函数的方式(应为他传递的规则是字符串,只有这样才能进行字符串的拼接。)
let type = "crTel";
reg= /^@"+ type +"@$/;
console.log(reg.test("@crTel@")); //false
reg = new RegExp("^@"+type+"@$");
console.log(reg.test("@crTel@")); //true