解析Js正则表达式
程序员文章站
2022-07-13 12:26:42
...
Js正则表达式
-
正则表达式是对字符串操作的一种逻辑公式
-
这里推荐一个正则表达式的在线测试网站:正则表达式在线测试
正则语法
-
在 JavaScript 中,正则表达式也是对象,是一种索引类型。
-
使用一个正则表达式字面量是最简单的方式。两个 / 是正则表达式的定界符。
-
创建正则的方法有两种:
//创建正则的第一种方法 , 正则的字面量
var reg = /abc/;
//第二种,通过 构造函数 的创建
var reg1 = new RegExp("adf")
使用正则,如下代码:
var str = "aaababggbdssddbbssGGGwew";
console.log(str.match(/s+/));
//修饰符g 实现全局查找
console.log(str.match(/s+/g));
// i 修饰符 字母大小写不敏感
console.log(str.match(/g+/ig));
正则表达式方法结合字符串的方法使用
字符串的方法:
- split() 根据匹配字符串切割父字符串
//与字符串相关方法 split ---- 分割
// split方法:分隔字符串,成为一个数组
var str = "aaa cde ssss rrrrrre eeer";
//使用一个空格字符进行精确分隔
var str1 = str.split(" ");
console.log(str1)
// 使用正则表达式进行模糊匹配分割
var str2 = str.split(/\s+/);//空白(\s)出现一次或是多次(+)
console.log(str2);
- match() 使用正则表达式与字符串相比较,返回一个包含匹配结果的数组。
// match 寻找匹配字符串
//aaansdddsopqwqeieaaaaasdffff 寻找重复的a
var a = "aaansdddsopqwqeieaaaaasdffff";
console.log(a.match(/a+/));//匹配了第一个后就结束
// 边界符,全局修饰符---g,如果有全局修饰符g,会找到所有匹配的字符串后结束
console.log(a.match(/a+/g));//匹配了第一个后就结束
var a2 = "aaa o obbb o o aaa";
console.log(a2.match(/o\s+o/g));//找"o o"
- search() 对正则表达式或指定字符串进行搜索,返回第一个出现的匹配项的下标。
//search--- 找出搜索字符串在父字符串的位置,返回的是位置
var s = "addhed";
console.log(s.search("e"));
console.log(s.search(/dh/));
//search与indexof不同的是,search支持正则表达式
- replace() 用正则表达式和字符串直接比较,然后用新的子串来替换被匹配的子串。
//replace 替换字符串为指定字符串,原始字符串不受影响
var a3 = "alo hahaha hei";
console.log(a3);
console.log(a3.replace(/hei/,"hello"));
正则表达式方法:
- exec() 在目标字符串中执行一次正则匹配操作。
// 正则方法------exec 寻找匹配字符串,找到停止(全局修饰符也没用)
var a4 = "aaabssdertttr";
console.log(/ab/.exec(a4));
- test() 测试当前正则是否能匹配目标字符串
//test 检测字符串是否符合正则表达式的规则 , 返回布尔值
console.log(/ab/.test(a4));
console.log(/aeb/.test(a4));
如何在一个字符串内换行不报错,将字符串的双引号换成即可反引号
正则的术语
* 字符集:字符集 [ ] ,字符中的一个字符串,多选一效果,有一个满足就算匹配成功
* 简单类: 正则的多个字符对应一个字符,我们可以用 [] 把它们括起来,让 [ ] 这个整体对应一个字符[abc]
//简单类:多个可能匹配的字符连续写在一起,只要其中一个匹配成功即可
var reg = /[abd]/;
console.log(reg.test("aafaasd"));
- 范围类: 有时匹配的东西过多,而且类型又相同,全部输入太麻烦,我们可以在中间加了个横线。[a-z]、[0-9]、[A-Z]
//范围类 匹配同一类型且连续在一起的字符,中间-连接
var r2 = /[0-9]/;
console.log(r2.test("233oiuoisd"));
var r3 = /[a-z]/;
console.log(r3.test("233oiuoisd"));
- 负向类: [] 前面加个元字符进行取反,表示匹配不能为括号里面的字符。
[^a]
//负向类 [^a]---- 只要不是a就匹配成功 (^和[]一起用)
var r4 = /[^e-h]/;
console.log(r4.test("233oiuoisd"));
- 组合类: 允许用中括号匹配不同类型的单个字符。[0-9a-b]
//组合类 单一类型或简单类 并不能匹配所有结果
//将多个写法书写在一起
var r5 = /[0-9a-z]/;
console.log(r5.test("233oiuoisd"));
//如果数字、大写字母、小写字母,按照这种顺序书写完整的范围,可以进行缩写
// [0-Z]、[0-z]
var r6 = /[0-Z]/;
console.log(r6.test("233oiuAoisd"));
-
修饰符
-
g 修饰符用于执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。
-
i 修饰符用于执行对大小写不敏感的匹配。
-
var str = "aaababggbdssddbbssGGGwew";
console.log(str.match(/s+/));
//修饰符g 实现全局查找
console.log(str.match(/s+/g));
// i 修饰符 字母大小写不敏感
console.log(str.match(/g+/ig));
-
边界
-
^ 开头 注意不能紧跟于左中括号的后面
-
$ 结尾
-
var str = "hello**world";
//开头 ^ ,表示限制开头,后面的正则内容匹配的结果必须是字符串的开始
// ^ ,不要和[]一起用,否则会变成反向类
console.log(/^hello/.test(str));
//结尾 $ ,表示结尾,前面的正则内容匹配的结果必须是字符串的结尾
console.log(/ld$/.test(str));
-
预定义类
- .(点) 除了换行和回车之外的任意字符
- \d 数字字符
- \D 非数字字符
- \s 空白字符
- \S 非空白字符
- \w 单词字符(所有的字母/数字/下划线)
- \W 非单词字符
-
量词
- {n} 硬性量词 :对应零次或者n次
// {n} 硬性量词 对应出现零次 或 n次
// /^$/限制内容为
console.log(/^\d{5}$/.test("123"));//false
console.log(/^\d{5}$/.test("12345"));//true
console.log(/^\d{5}$/.test("123456"));//false
- {n,m} 软性量词 :至少出现n次但不超过m次(中间不能有空格)
//{n,m} 软性量词 至少出现n次但不超过m次(中间不能有空格)
console.log(/^\d{5,7}$/.test("124443"));
console.log(/^\d{5,7}$/.test("1244999943"));
- {n,} 软性量词 :至少出现n次(+的升级版)
//{n,} 软性量词 至少出现n次(+的升级版)
console.log(/^\d{5,}$/.test("124443"));
- ? 软性量词: 出现零次或一次
//? ------ 出现零次或一次
console.log(/^\d{0,1}$/.test("2"));
console.log(/^\d?$/.test("3"));
console.log(/^\d{0,1}$/.test("124443"));
console.log(/^\d?$/.test("124443"));
-
*
软性量词 :出现零次或多次(任意次)
//* ------ 出现零次或多次(任意次)
console.log(/^\d*}$/.test("124443"));
console.log(/^\d*$/.test(""));
-
+
软性量词 :出现一次或多次(至少一次)
//+ ------ 出现一次或多次 (至少一次)
console.log(/^\d+$/.test("124443"));
console.log(/^\d+$/.test(""));
- 分组:用中括号表示范围内选择,大括号表示重复次数。如果想获取重复多个字符,就用小括号进行分组
// 匹配 连续重复出现字符串
console.log(/^(abc){2}$/.test("abcabc"));
console.log(/^(abc){2}$/.test("aabbcc"));
- 或操作符
//或操作符
// 竖线(|)
// /a|bd/ 匹配a或bd a、bd都出现也是对的
console.log(/^a|abc$/.test("aabcabc"));
分组和或组合使用
// a、bd二选一时 分组和或搭配使用
console.log(/^(a|bd)$/.test("abd"));
console.log(/^(a|bd)$/.test("bd"));
console.log(/^(a|bd)$/.test("ab"));
// /(ab)+|(cd)+/ 匹配出现一次或多次的ab或cd
console.log(/^(ab)+(cd)+$/.test("abcaadcdcdcdabc"));
- 分组的反向引用
//分组的反向引用
// 正则中通过分组匹配到的字符串,会被进行编号,从1开始
// 在正则内部可以通过 \1 方式,去对字符串进行反向引用
console.log(/^([a-z]{3})\1$/.test("abcabc"));
console.log(/^([a-z]{3})\1$/.test("abcadc"));
String函数replace的语法格式是stringobject.replace(reg/str,replacement),replacement可以是字符串也可以是函数。结合分组的反向引用可以实现对字符串的更多操作
//正则表达式以外 $1 ,进行字符串引用 多用于replace
var str = "123*499".replace(/^(\d{3})\*(\d{3})$/,"$2*$1");
console.log(str);
//replace 的第二个参数还可以是函数
var str2 = "111*222".replace(/^(\d{3})\*(\d{3})$/,function(match,$1,$2){
return $2*10 + "," + $1;
});
console.log(str2);
- 中文字符
匹配中文:[\u4e00-\u9fa5]
// [\u4e00-\u9fa5]
console.log(/^[\u4e00-\u9fa5]+$/.test("中文字符集"));
console.log(/^[a-z\u4e00-\u9fa5]+$/.test("中文字符集a"));//只要不全是中文就是false