解析Js 正则表达式

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
posted @ 2021-03-17 14:34  小白可别不举铁  阅读(348)  评论(0编辑  收藏  举报