一、正则表达式的组成
-
什么是正则表达式?
简单来说正则表达式是一个字符串、是一个对字符串进行处理的的字符串。 -
字符串的处理
匹配: match
提取: match
替换:replace
切割:split -
组成部分
边界词
字符
数量
修饰词
分组
二、数量词的使用
- 数量词是用在字符的后面,用来定义这个字符的个数的
- [a]{n} 表示a出现n次
- [a]{n,} 表示a至少出现n次
- [a]{n,m} 表示a至少出现n次,最多出现m次
- [a] ? 表示a出现0次或则1次
- [a]* 表示a出现0次或者多次
- [a]+ 表示a出现1次或则多次
下面展示 示例代码
。
//验证一个手机号码是否合法
//要求必须是1开头的11位数字,第二位数字3-9
function Tel(){
let Tels=/1[3-9][0-9]{9}/;
let t=div.match(Tels);
if(t){
alert("是一个合法的手机号码");
}else{
aler("不是一个合法的手机号码");
}
}
三、贪婪性数量词和懒惰性数量词
- 贪婪性数量词
javascript中默认的就是贪婪性数量
而在Java中数量词后用+表示 - 懒惰性数量词
{3,}?数量是3次及以上,但尽可能少
{3,10}?数量是3到10次,但尽可能少
?? 数量是0次或者1次,但尽可能少
*?数量是0次或者多次,但尽可能少
+?数量是1次或则多次,但尽可能少
下面展示一下 贪婪性和懒惰性的区别
。
let s = "bdbcdebcerd";
let regex =/b[a-z]*d/;
let t = s.match(regex);
console.log(t);
//输出结果 bddcdebcerd 默认贪婪性的
//let regex =/b[a-z]*?d/; *?数量是0次或者多次,尽可能少;
//s值有多个bd重复的,贪恋型是匹配输出全部,懒惰性输出结果为ad;
四、边界词的使用
- 一行的开头 ^
- 一行的结尾 $
加个^$符号,代表整行匹配,必须全部一样,否则结果为null,如下代码所示,如果s的值后面再加上三个"1";
let s = "bdbcdebcerd111";
let regex =/b[a-z]*d/; //如果没加^$标识,则输出为bdbcdebcerd
let t = s.match(regex); //如果加了 let regex =/^b[a-z]*d$/; 输出结果为null
console.log(t);
- 单词边界\b
表示单词的边界,用于取出内容中N个数字的单词.
let a="wo ai ni zhong guo "
let b=/\b[a-z]{2}\b/gi;
let c= a.match(b);
console.log(c);
//输出结果为wo ai ni
//此用法对中文没有意义
五、分组及分组的捕获
- 通过案列来解释分组及分组的捕获
使用()对正则表达式分组
整个表达式默认是一个分组,下标默认是0
每一个分组都有一个默认的下标
下标是从0开始的连续的整数
由于一般情况下,整个表达式分组的括号是不写的,所以一般我们看到的第一 个括号就是第二组,下标自然就为1
拿到下标后可以用来捕获分组let a = abbc //affc //aooc let b=/ a(.)\1c/; // \1是代表下标1的值, 重复前面字符一次 let c=a.match(b);
六、断言的使用
- 案列说明断言的使用
let msg ="帮别人代打游戏,tel:13512345678,qq:546711334 wx:1234567890"
//如何从字符串中找到tel 或qq之一
let a =/(?<=tel:)\b{11}/g; //单反()中问号开头,不是分组,
// 而是断言 <表示前面(左边)
//如果(?!=tel:)则!表示"不是"tel的数字,则输出qq,wx的值
let b=mas.match(a); //前面是tel:开头的\b的11位数字
//如果是后边(右边)将改成(?=tel)