正则表达式定义组成及使用方法

正则表达式

1.正则表达式简介

正则表达式定义

定义:正则表达式用于定义一些字符串的规则。

作用:计算机可以根据正则表达式,来检查一个字符串是否符合指定的规则;或者将字符串中符合规则的内容提取出来。

正则表达式的组成

  • 普通字符
  • 特殊字符(元字符):正则表达式中有特殊意义的字符

示例演示:

  • \d 匹配数字
  • ab\d 匹配 ab1、ab2
常用元字符串
元字符说明
\d匹配数字
\D匹配任意非数字的字符
\w匹配字母或数字或下划线
\W匹配任意不是字母,数字,下划线
\s匹配任意的空白符
\S匹配任意不是空白符的字符
.匹配除换行符以外的任意单个字符
^表示匹配行首的文本(以谁开始)
$表示匹配行尾的文本(以谁结束)
限定符
限定符说明
*重复零次或更多次
+重复一次或更多次
?重复零次或一次
{n}重复n次
{n,}重复n次或更多次
{n,m}重复n到m次

案例

验证手机号:

^\d{11}$

验证日期 2019-7-26

^\d{4}-\d{1,2}-\d{1,2}$

验证邮箱 xxxxxx@xx.xxx:

^\w+@\w+\.\w+$

验证IP地址 192.168.1.10

^\d{1,3}\(.\d{1,3}){3}$

2.创建正则表达式的对象

方式一:使用构造函数创建正则表达式的对象

语法:

	var 变量 = new RegExp("正则表达式"); // 注意,参数是字符串

	var 变量 = new RegExp("正则表达式", "匹配模式"); // 注意,两个参数都是字符串

备注:RegExp的意思是 Regular expression。使用typeof检查正则对象,会返回object。

上面的语法中,既可以传一个参数,也可以传两个参数。

创建了正则表达式的对象后,该怎么使用呢?大致分为两个步骤:

  • (1)创建正则表达式的对象 reg。
  • (2)使用 reg 的test() 方法,判断指定字符串是否符合规则。

我们来看看下面的例子。

1、传一个参数时

构造函数 RegExp 中,可以只传一个参数。

代码举例:

	var myreg = new RegExp("x"); // 定义一个正则表达式:检查一个字符串中是否含有 x

	var str1 = "zoexyf";
	var str2 = "zoe";

	// 通过 test()方法,判断字符串是否符合 上面定义的 reg 规则
	console.log(myreg.test(str1)); // 打印结果:true
	console.log(myreg.test(str2)); // 打印结果:false

注意,上面的例子中,我们是先定义了一个正则表达式的规则,然后通过正则表达式的test()方法来判断字符串是否符合之前定义的规则。

正则表达式的test()方法:

	myReg.test(str); // 判断字符串 str 是否符合 指定的 myReg 这个正则表达式的规则

解释:使用test()这个方法可以用来检查一个字符串是否符合正则表达式的规则,如果符合则返回true,否则返回false

2、传两个参数时:匹配模式 【重要】

构造函数 RegExp 中,也可以传两个参数。我们可以传递一个匹配模式作为第二个参数。这个参数可以是:

  • i 忽略大小写。这里的 i 指的是 ignore。
  • g 全局匹配模式。这里的 g 指的是 global。

代码举例:

    var reg = new RegExp('e', 'i');
    var str = 'ZOE';

    console.log(reg.test(str)); // 打印结果:true

关于参数的说明: 在ES5中,第一个参数要求是字符串如 ‘e’ ,但ES6中可以直接使用正则表达式 如 /e/ig ,但第二个确定匹配模式的参数会覆盖第一个参数的正则所要求的

方式二:使用字面量创建正则表达式

我们可以使用字面量来创建正则表达式。

语法:

	var 变量 = /正则表达式/;  // 注意,这个语法里没有引号

	var 变量 = /正则表达式/匹配模式;  // 注意,这个语法里没有引号

代码举例:

	var reg = /e/i; // 定义正则表达式的规则:检查一个字符串中是否含有 e。忽略大小写。
	var str = "ZOE";

	console.log(typeof reg);  // 打印结果:object
	console.log(reg.test(str)); // 打印结果:true

两种方式的对比

以上两种方式的对比

  • 方式一:使用构造函数创建时,更加灵活,因为参数中还可以传递变量。
  • 方式二:使用字面量的方式创建,更加简单。

代码举例:

	var reg = new RegExp("a", "i"); // 方式一

	var reg = /a/i; // 方式二

上面这两行代码的作用是等价的。

3.正则表达式的常见语法

检查字符串中是否包含 a或b

写法1

	var reg = /a|b/;

解释:使用 | 表示的意思。

写法2

	var reg = /[ab]/;  // 跟上面的那行语法,是等价的

解释:这里的[]也是表示的意思。

[]这个符号在正则还是比较常用的。我们接下来看几个例子。

[]表示:或

一些规则:

  • /[ab]/ 等价于 /a|b/:检查一个字符串中是否包含 a或b
  • /[a-z]/:检查一个字符串那种是否包含任意小写字母
  • /[A-Z]/:任意大写字母
  • /[A-z]/:任意字母
  • /[0-9]/:任意数字
  • /a[bde]c/:检查一个字符串中是否包含 abc 或 adc 或 aec

[^ ] 表示:除了

举例1:

  var reg = /[^ab]/; // 规则:字符串中,除了a、b之外,还有没有其他的字符内容
  var str = "acb";

  console.log(reg.test(str)); // 打印结果:true

举例2:(可以用来验证某字符串是否为 纯数字)

	var reg = /[^0-9]/;  // 规则:字符串中,除了数字之外,还有没有其他的内容
	var str1 = "1991";
	var str2 = "199a1";

	console.log(reg.test(str1)); // 打印结果:false (如果字符串是 纯数字,则返回 false)
	console.log(reg.test(str2)); // 打印结果:true

4.支持正则表达式的 String 对象的方法(4种)

String对象的如下方法,是支持正则表达式的:

方法描述备注
split()将字符串拆分成数组
search()搜索字符串中是否含有指定内容,返回索引 index
match()根据正则表达式,从一个字符串中将符合条件的内容提取出来
replace()将字符串中的指定内容,替换为新的内容并返回

下面来分别介绍和举例。

split()

split():将一个字符串拆分成一个数组。

split()方法可以接受一个正则表达式作为参数。

正则相关的举例:根据任意字母,将字符串拆分成数组。

代码实现:(通过正则)

	var str = "1a2b3c4d5e6f7g";

	var result = str.split(/[A-z]/); // 参数是一个正则表达式:表示所有字符
	console.log(result);

打印结果:

	["1", "2", "3", "4", "5", "6", "7", ""]

search()

search():搜索字符串中是否含有指定内容。如果搜索到指定内容,则会返回第一次出现的索引;否则返回-1。

search()方法可以接受一个正则表达式作为参数,然后会根据正则表达式去检索字符串。serach()只会查找第一个,即使设置全局匹配也没用。

举例

	var str = "hello abc hello aec afc";
	/*
	* 搜索字符串中是否含有abc 或 aec 或 afc
	*/
	result = str.search(/a[bef]c/);
	console.log(result); // 打印结果:6

match()

match():根据正则表达式,从一个字符串中将符合条件的内容提取出来,封装到一个数组中返回(即使只查询到一个结果)。

注意:默认情况下,match()方法只会找到第一个符合要求的内容,找到以后就停止检索。我们可以设置正则表达式为全局匹配模式,这样就会匹配到所有的内容。

另外,我们可以为一个正则表达式设置多个匹配模式,且顺序无所谓。

代码举例

	var str = "1a2a3a4a5e6f7A8B9C";

	var result1 = str.match(/[a-z]/);   // 找到符合要求的第一个内容,然后返回
	var result2 = str.match(/[a-z]/g);  // 设置为“全局匹配”模式,匹配字符串中所有的内容
	var result3 = str.match(/[a-z]/gi); // 设置多个匹配模式,且顺序无所谓

	console.log(result1); // 打印结果:["a"]
	console.log(result2); // 打印结果:["a", "a", "a", "a", "e", "f"]
	console.log(result3); // 打印结果:["a", "a", "a", "a", "e", "f", "A", "B", "C"]

总结

match()这个方法还是很实用的,可以在一个很长的字符串中,提取出有规则的内容。

replace()

replace():将字符串中的指定内容,替换为新的内容并返回。不会修改原字符串。

语法:

	新的字符串 = str.replace(被替换的内容,新的内容);

参数解释:

  • 被替换的内容:可以接受一个正则表达式作为参数。
  • 新的内容:默认只会替换第一个。如果需要替换全部符合条件的内容,可以设置正则表达式为全局匹配模式。

代码举例:

    //replace()方法:替换
    var str2 = "Today is fine day,today is fine day !!!"

    console.log(str2);
    console.log(str2.replace("today","tomorrow"));  //只能替换第一个today
    console.log(str2.replace(/today/gi,"tomorrow")); //这里用到了正则,且为“全局匹配”模式,才能替换所有的today

补充:字符串对象共有4个方法,可以使用正则表达式:match()、replace()、search()和split()。

​ ES6将这4个方法,在语言内部全部调用RegExp的实例方法,从而做到所有与正则相关的方法,全都定义在RegExp对象上。

  • String.prototype.match 调用Reg.prototype[Symbol.match]

  • String.prototype.replace 调用Reg.prototype[Symbol.replace]

  • String.prototype.search调用 Reg.prototype[Symbol.search]

  • String.prototype.split 调用Reg.prototype[Symbol.split]

补充:exec()

exec() 方法用于检索字符串中的正则表达式的匹配。

  • 语法:RegExpObject.exec(string)
  • 返回值:返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null。
  • 如果 exec() 找到了匹配的文本,则返回一个结果数组。否则,返回 null。此数组的第 0 个元素是与正则表达式相匹配的文本,第 1 个元素是与 RegExpObject 的第 1 个子表达式相匹配的文本(如果有的话),第 2 个元素是与 RegExpObject 的第 2 个子表达式相匹配的文本(如果有的话),以此类推。

5.一些拓展

5.1 U修饰符

​ ES6对正则表达式添加了u 修饰符,含义为“Unicode模式”,用来正确处理大于 \uFFFF 的Unicode字符。也就是说,会正确处理四个字节的UTF­16编码。

​ 例如:\uD83D\uDC2A是一个四个字节的UTF­16编码,代表一个字符。但是,ES5不支持四个字节 的UTF­16编码码,会将其识别为两个字符,导致\uD83D/.test('\uD83D\uDC2A') 代码结果为true(这是错误的)。加了u修饰符以后,ES6就会识别其为 一个字符,所以\uD83D/u.test('\uD83D\uDC2A') 代码结果为false 。

\uD83D/.test('\uD83D\uDC2A')
//true(识别成了两个字符,不应该为true)

\uD83D/u.test('\uD83D\uDC2A')
//flase(加了U修饰符限定后,这样才是正确的)

注意:[\u4e00-\u9fa5]范围 匹配汉字

5.2 y修饰符

​ y修饰符的作用与g修饰符类似,也是全局匹配,后一次匹配都从上一次匹配成功的下一个位置开始。不同之处

在于,g修饰符只要剩余位置中存在匹配就可,而y修饰符确保匹配必须从剩余的第一个位置开始,这也就是“粘

连”的涵义。

5.3 sticky属性

与y修饰符相匹配,ES6的正则对象多了sticky属性,表示是否设置了y修饰符。

var z=/zoe\d/y
z.sticky //true

5.4 flag属性

ES6为正则表达式新增了flags属性,会返回正则表达式的修饰符。

  • ES5的source属性——返回正则表达式的正文
  • ES6的flags属性——返回正则表达式的修饰符

5.5 s修饰符:dotAll模式

正则表达式中 ,点(.)是一个特殊字符,代表任意的单个字符,但是行终止符除外

以下四个字符属于行终止符:

换行符\n(U+00A) , 回车符 \r(U+00D), 行分隔符(U+2028), 段分隔符(U+2029)

/foo.bar/.test('foo\nbar')
//flase

/foo.bar/s.test('foo\nbar')
//true
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值