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. 效果图

在编程中处理与正则表达式匹配的元组时,通常涉及解析字符串并提取满足特定模式的部分。正则表达式(Regular Expressions)提供了一种灵活的方式来匹配、捕获和操作字符串中的特定格式。在处理元组时,可以将匹配的结果存储为元组结构,以便后续使用。 例如,在 Python 中,可以使用 `re` 模块来执行正则表达式匹配,并通过捕获组(capture groups)提取数据。匹配结果可以以元组的形式返回,从而方便地进行解包或进一步处理。 以下是一个使用正则表达式匹配字符串并提取元组的示例: ```python import re # 示例字符串 text = "John Doe, 30 years old, lives in New York" # 正则表达式模式,匹配姓名、年龄和城市 pattern = r"([A-Za-z ]+), ([0-9]+) years old, lives in ([A-Za-z ]+)" # 执行匹配 match = re.match(pattern, text) if match: # 提取匹配结果为元组 result_tuple = match.groups() print("Extracted tuple:", result_tuple) else: print("No match found.") ``` 输出结果为: ``` Extracted tuple: ('John Doe', '30', 'New York') ``` 在上述代码中,`re.match` 方法用于匹配字符串,`match.groups()` 返回一个包含所有捕获组的元组。这种方式可以用于处理需要从字符串中提取多个字段的场景[^2]。 如果需要处理多个匹配项,可以使用 `re.findall` 或 `re.finditer` 方法。`re.findall` 返回所有匹配项的元组列表,而 `re.finditer` 返回一个迭代器,每个元素都是一个匹配对象,包含匹配的位置和捕获组信息。 ### 示例:使用 `re.findall` 提取多个匹配项 ```python # 多个匹配项的字符串 text_multiple = """ John Doe, 30 years old, lives in New York Jane Smith, 25 years old, lives in San Francisco """ # 执行查找所有匹配项 all_matches = re.findall(pattern, text_multiple) for entry in all_matches: print(entry) ``` 输出结果为: ``` ('John Doe', '30', 'New York') ('Jane Smith', '25', 'San Francisco') ``` 通过这种方式,可以有效地处理多个匹配项并将结果存储为元组列表,便于后续的数据处理和分析。 ### 相关问题 1. 如何在 Python 中使用正则表达式提取嵌套括号中的内容? 2. 如何将正则表达式匹配的字符串转换为自定义数据结构? 3. 如何处理正则表达式匹配中的可选字段? 4. 如何使用正则表达式匹配并提取 JSON 字符串中的字段? 5. 如何在 JavaScript 中使用正则表达式处理字符串并提取元组?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值