欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

解析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