095_RegExp对象

1. RegExp对象

1.1. RegExp对象表示正则表达式, 它是对字符串执行模式匹配的强大工具。

1.2. 字面量语法

/pattern/attributes;

1.3. 创建RegExp对象的语法:

new RegExp(pattern, attributes);

1.4. 参数

1.4.1. 参数pattern是一个字符串或正则表达式。

1.4.2. 参数attributes是一个可选的字符串, 包含属性"g"、"i"和"m", 分别用于指定全局匹配、区分大小写的匹配和多行匹配。ECMAScript标准化之前, 不支持m属性。如果pattern是包含修饰符的正则表达式, 则必须省略该参数。

1.5. 返回值

1.5.1. 一个新的RegExp对象, 具有指定的模式和标志。如果参数pattern是正则表达式而不是字符串, 那么RegExp()构造函数将用与指定的RegExp相同的模式和标志创建一个新的RegExp对象。

1.5.2. 如果不用new运算符, 而将RegExp()作为函数调用, 那么它的行为与用new运算符调用时一样, 只是当pattern是正则表达式时, 它只返回pattern, 而不再创建一个新的RegExp对象。

1.6. 尽管可以使用RegExp构造函数创建正则表达式, 但最好不要使用它, 因为使用构造函数比字面量创建正则表达式要慢得多。

2. RegExp对象属性

3. RegExp对象方法

4. test()方法

4.1. test()方法用于检测一个字符串是否匹配某个模式。

4.2. 语法

regExpObject.test(string)

4.3. 参数

4.4. 返回值

4.4.1. 如果字符串string中含有与RegExpObject匹配的文本, 则返回true, 否则返回false。

5. exec()方法

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

5.2. 语法

regExpObject.exec(string)

5.3. 参数

5.4. 返回值

5.4.1. 返回一个数组, 其中存放匹配的结果。如果未找到匹配, 则返回值为null。

5.5. 如果exec()找到了匹配的文本, 则返回一个结果数组。否则, 返回null。此数组的第0个元素是与正则表达式相匹配的文本, 第1个元素是与RegExpObject的第1个子表达式相匹配的文本(如果有的话), 第2个元素是与RegExpObject的第2个子表达式相匹配的文本(如果有的话), 以此类推。除了数组元素和length属性之外, exec()方法还返回两个属性。index 属性声明的是匹配文本的第一个字符的位置。input属性则存放的是被检索的字符串string。我们可以看得出, 在调用非全局的RegExp对象的exec()方法时, 返回的数组与调用方法String.match() 返回的数组是相同的。

5.6. 但是, 当RegExpObject是一个全局正则表达式时, exec()的行为就稍微复杂一些。它会在RegExpObject的lastIndex属性指定的字符处开始检索字符串string。当exec()找到了与表达式相匹配的文本时, 在匹配后, 它将把RegExpObject的lastIndex属性设置为匹配文本的最后一个字符的下一个位置。这就是说, 您可以通过反复调用exec() 方法来遍历字符串中的所有匹配文本。当exec()再也找不到匹配的文本时, 它将返回null, 并把lastIndex属性重置为0。

5.7. 如果在一个字符串中完成了一次模式匹配之后要开始检索新的字符串, 就必须手动地把lastIndex属性重置为0。

5.8. 请注意, 无论RegExpObject是否是全局模式, exec()都会把完整的细节添加到它返回的数组中。这就是exec()与String.match()的不同之处, 后者在全局模式下返回的信息要少得多。因此我们可以这么说, 在循环中反复地调用exec()方法是唯一一种获得全局模式的完整模式匹配信息的方法。

6. 例子

6.1. 代码

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title>RegExp对象</title>
	</head>
	<body>
		<script type="text/javascript">
			var re1 = new RegExp(/\s/);
			var r1 = re1.test('1\v2');
			document.write('\\s匹配垂直制表符: ' + r1 + ', global = ' + re1.global + ', ignoreCase = ' + re1.ignoreCase + ', multiline = ' + re1.multiline + ', source = ' + re1.source + '<br />');

			var re2 = new RegExp(/\s/i);
			var r2 = re2.test('1\f2');
			document.write('\\s匹配换页符: ' + r2 + ', global = ' + re2.global + ', ignoreCase = ' + re2.ignoreCase + ', multiline = ' + re2.multiline + ', source = ' + re2.source + '<br />');

			var re3 = new RegExp(/\s/g);
			var r3 = re3.test('1\t2');
			document.write('\\s匹配制表符: ' + r3 + ', global = ' + re3.global + ', ignoreCase = ' + re3.ignoreCase + ', multiline = ' + re3.multiline + ', lastIndex = ' + re3.lastIndex + ', source = ' + re3.source + '<br />');

			var re4 = new RegExp(/\s/m);
			var r4 = re4.test('1\r2');
			document.write('\\s匹配回车符: ' + r4 + ', global = ' + re4.global + ', ignoreCase = ' + re4.ignoreCase + ', multiline = ' + re4.multiline + ', source = ' + re4.source + '<br />');

			var re5 = new RegExp(/\s/, 'i');
			var r5 = re5.test('1\n2');
			document.write('\\s匹配换行符: ' + r5 + ', global = ' + re5.global + ', ignoreCase = ' + re5.ignoreCase + ', multiline = ' + re5.multiline + ', source = ' + re5.source + '<br />');

			var re6 = new RegExp(/\s/, 'g');
			var r6 = re6.test('1 2');
			document.write('\\s匹配空格: ' + r6 + ', global = ' + re6.global + ', ignoreCase = ' + re6.ignoreCase + ', multiline = ' + re6.multiline + ', lastIndex = ' + re6.lastIndex + ', source = ' + re6.source + '<br />');

			var re7 = new RegExp(/\s/, 'm');
			var r7 = re7.test('1	2');
			document.write('\\s匹配tab键: ' + r7 + ', global = ' + re7.global + ', ignoreCase = ' + re7.ignoreCase + ', multiline = ' + re7.multiline + ', source = ' + re7.source + '<hr />');
			
			var str1 = 'Ruan jian bao dian wang fu wu yu 100 duo suo gao xiao, 200000 duo wan de gao xiao xue sheng he lao shi, yi gong you 30 duo wan yong hu le。';
			var result = null;

			var m1 = str1.match(/\d+/);
			document.write('匹配结果: ' + m1 + ', 匹配位置: ' + m1.index + ', 原字符串: ' + m1.input + '<br />');
			var mre1 = new RegExp(/\d+/, 'g')
			var m2 = str1.match(mre1);
			document.write('匹配结果: ' + m2 + ', global = ' + mre1.global + ', ignoreCase = ' + mre1.ignoreCase + ', multiline = ' + mre1.multiline + ', source = ' + mre1.source + '<hr />');

			// 只有new RegExp()返回的对象, 执行检测后才有global, ignoreCase, multiline属性
			var e1 = /\d+/.exec(str1);
			document.write('匹配结果: ' + e1 + ', 匹配位置: ' + e1.index + ', 原字符串: ' + e1.input + '<br />');
			var e2 = /\d+/g.exec(str1);
			document.write('匹配结果: ' + e2 + ', 匹配位置: ' + e2.index + ', 原字符串: ' + e2.input + '<hr />');

			// 全局匹配使用exec()方法, 循环调用打印所有匹配结果。
			var ere1 = new RegExp(/\d+/, 'g')
			while((result = ere1.exec(str1)) != null) {
				document.write('匹配结果: ' + result + ', 匹配位置: ' + result.index + ', 原字符串: ' + result.input + ', 下一次开始匹配的位置: ' + ere1.lastIndex + '<br />');
			}

			var sre1 = new RegExp('ruan jian', 'igm');
			var s1 = 'Ruan jian bao dian, ruan jian ke ji'.match(sre1);
			document.write('<hr />匹配结果: ' + s1 + ', global = ' + sre1.global + ', ignoreCase = ' + sre1.ignoreCase + ', multiline = ' + sre1.multiline + ', source = ' + sre1.source);
		</script>
	</body>
</html>

6.2. 效果图

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值