正则表达式 RegExp

本文详细介绍了正则表达式的基础知识,包括概念、组成、正则对象的创建与方法、修饰符、元字符、字符类、量词、转义字符、分组、或、断言、匹配模式以及字符串中与正则相关的常用方法。通过学习,读者将全面掌握正则表达式在前端和后端开发中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、正则表达式的概念

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

二、正则表达式的组成

正则表达式由元字符,字符类,和量词组成 /^([字符类]{量词})([字符类]{量词})$/

三、正则对象 RegExp

  1. 通过new 关键字声明正则对象
		//  正则规则: 可以是字符串类型,也可以是正则
		
		var patt = new RegExp(正则规则,  修饰符)
		var patt = new RegExp('a',  'g')
		var patt = new RegExp(/a/,  'g')
  1. 字面量的形式
		var patt = /正则规则/修饰符

两种方式的区别

字面量形式不能接受变量

四、正则对象的方法

  1. test() : 执行一个检索,用来查看正则表达式与指定的字符串是否匹配。返回 true 或 false。

  2. exec() : 在一个指定字符串中执行一个搜索匹配。返回一个结果数组(包含所有匹配的结果)或 null(没有匹配则为null)。如果要检索出所有匹配的结果,则需要使用循环
    该方法在执行时,通过lastIndex属性会纪录每次匹配结束的位置,下次执行则从lastIndex纪录的位置开始; 找不到匹配的结果时,lastIndex属性会重置为0, 从头开始

		var patt = /o/g;
		var str = 'hello world oo';
		var res1 = patt.exec(str) 
		var res2 = patt.exec(str) 
		var res3 = patt.exec(str) 
		
		//  借助循环获取所有的结果
		let res;
		while(res = patt.exec(str)){
		 console.log(res)
		}

五、修饰符

  • g : 全局匹配
  • i : 不区分大小写
  • m : 多行匹配

六、元字符

  • ^ : 匹配以什么作为开始
  • $ : 匹配一什么作为结束
  • () : 分组或者反向引用
  • | : 或

七、字符类

  • [xyz] : 字符类的集合, 匹配方括号中的任意字符
  • [^xyz] : 一个反向字符集。也就是说, 它匹配任何没有包含在方括号中的字符
    在字符类中可以使用-表示范围的集合
  • [0-9] : 匹配数字0 到 9
  • [a-z] : 匹配小写字母
  • [A-Z] : 匹配大写字母
  • [A-Za-z] : 匹配大小写字母
  • [A-Za-z0-9] : 匹配大小写字母以及数字
  • . : 默认匹配除换行符之外的任何单个字符。

针对常用的匹配规则,可以使用简写等价形式

  • \w : 等价形式 [A-Za-z0-9_]

  • \W : 匹配一个非单字字符。等价于 [^A-Za-z0-9_]

  • \d : 等价于 [0-9]

  • \D :匹配一个非数字字符 等价于 [^0-9]

  • \s : 匹配任意的空白符

  • \S :除了空白符以外的

八、量词

量词限定字符类出现的次数; 量词分为贪婪的和惰性的

  • * : 匹配0次或者多次 , 等价形式 {0,}
  • + : 匹配1次或者多次 , 等价形式 {1,}
  • ? : 匹配0次或者1次 , 等价形式 {0,1}
  • {n} : 匹配n次
  • {n,} : 至少匹配n次,最多不限
  • {n,m} : 最少匹配n次, 最多m次

九、转义字符 \

如果在正则表达式中匹配 需要匹配特殊的字符(正则规则中使用的字符), 需要借助于 转义字符 \特殊字符; 有时候为了避免出现不可控问题,需要使用双重转义\\字符

十、分组

() 分组和反向引用;
只分组不引用: ?:()

反向引用

反向引用 引用的是匹配的结果,而不是匹配的规则
反向引用 \n 数字n 是左括号的顺序

//  反向引用
var patt = /^<(h1)>\w{1,}<\/\1>/
var str = '<h1>hello</h1>';
var res = patt.test(str)

//  只分组, 不引用
var patt = /^((?:(ECMA)Script)Hello)$/
var str = 'ECMAScriptHello';
var res = patt.test(str);
//  反向引用 $n : n 是左括号的顺序; 如果是正则对象的属性,使用 $n; 如果在正则表达式中使用,则使用 \n

console.log(RegExp.$1);
console.log(RegExp.$2);
console.log(RegExp.$3);
console.log(RegExp.$4);

十一、或

var patt = /hello(red)|(black)/
var patt = /hello[a|b]/

十二、断言

  • x(?=y) :匹配’x’仅仅当’x’后面跟着’y’.这种叫做先行断言(正向前瞻)。
  • x(?!y) : 仅仅当’x’后面不跟着’y’时匹配’x’,这被称为正向否定查找(负向前瞻)。

十三、匹配模式

正则规则的匹配模式有两种: 贪婪模式和惰性模式

  • 贪婪模式: 尽可能多的去匹配
  var str = '123456789012345678900';
  var res = str.match(/\d{3,6}/g);
  • 惰性模式: 尽可能少的去匹配
    可以在贪婪模式的后边添加 ? 变成惰性模式 +? *? {n,}? {n,m}? ??
var str = '123456789012345678900';
var res = str.match(/\d{3,6}?/g);

十四、字符串中和正则相关的方法

  • replace():替换与正则表达式匹配的字符串; 默认替换的是第一次匹配的字符串; 如果要替换全部得 ,则需要全局匹配
'hello world'.replace(/o/, 'javascript')// 默认替换第一个
'hello world'.replace(/o/g, 'javascript') // 全部替换
  • match() :找到一个或者多个正则表达式匹配的结果数组,
var str = 'hella world';
// let res = str.match(/o/g);  //   如果有全局修饰符g 结果是一个数组 ['o', 'o']
let res = str.match(/o/);
console.log(res);
/* //  没有全局修饰符g的结果解析:
    0: "o" // 索引值 匹配的结果(数组中的内容的索引值)
    groups: undefined 
    index: 4 //  匹配的字符在指定的字符串中第一次出现位置的索引值
    input: "hello world"  // 匹配的指定的字符
    length: 1 // 数组的长度
 */

  • search() :匹配指定的字符串中是否含有指定的字符; 它返回匹配到的位置索引,或者在失败时返回-1。
    var str = 'hello';
    // var res = str.search(/e/)
    var res = str.search(/a/)
    console.log(res);
  • split() : 字符串的分割
    var str = 'haksdf2324hwehej2313jkfghwer5345634adf';
    var res = str.split(/\d{1,}/)
    console.log(res);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值