- A+
所属分类:Web前端
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(/os+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-zu4e00-u9fa5]+$/.test("中文字符集a"));//只要不全是中文就是false