正则表达式截取字符串
正则表达式是一种用来描述、匹配一定模式文本的工具,可以实现从字符串中截取出我们需要的内容。在字符串处理中,正则表达式是一个非常重要的工具,应用广泛。本文将详细介绍如何使用正则表达式截取字符串。
正则表达式语法
正则表达式是由字符和操作符组成的字符串,用于匹配文本中的字符模式。其中一些特殊字符被称为 “元字符”,它们具有特殊的含义,用于描述模式。下表是几种常用的特殊字符:
字符 | 描述 |
---|---|
. | 匹配任意一个字符 |
[] | 匹配括号内的任意一个字符,如[a-z]表示匹配任意一个小写字母 |
[^] | 匹配不在括号内的任意一个字符,如[^a-z]表示匹配任意不是小写字母的字符 |
* | 匹配前一个字符出现0次或多次,如a*表示匹配0个或多个a |
+ | 匹配前一个字符出现1次或多次,如a+表示匹配1个或多个a |
? | 匹配前一个字符出现0次或1次,如a?表示匹配0个或1个a |
{m,n} | 匹配前一个字符出现m到n次,如a{1,3}表示匹配1到3个a |
^ | 匹配行的开头 |
$ | 匹配行的结尾 |
正则表达式的使用
正则表达式的使用需要涉及到两种操作:匹配和提取,我们分别来讲述。
匹配操作
匹配操作可以使用 match()
方法,语法如下:
string.match(regexp)
其中,regexp
是一个正则表达式对象,string
是需要匹配的字符串。match()
方法会返回一个数组,其中第一个元素是匹配到的字符串,后面的元素是每一个正则表达式捕获的子串(捕获是指用括号括起来的部分)。
例如:
var str = "hello world";
var result = str.match(/(h\w+)\s(\w+)/);
console.log(result);
这里我们使用了一个正则表达式 /(h\w+)\s(\w+)/
,匹配字符串中以 h
开头的单词和接着的单词。执行结果如下:
["hello world", "hello", "world"]
可以看到,匹配到的第一个元素是 “hello world”,后面的元素 “hello” 和 “world” 分别是 /(h\w+)/
和 (\w+)/
捕获的子串。
提取操作
提取操作可以使用 exec()
方法,语法如下:
regexp.exec(string)
其中,regexp
是一个正则表达式对象,string
是需要匹配的字符串。exec()
方法会返回一个数组,其中第一个元素是匹配到的字符串,后面的元素是每一个正则表达式捕获的子串(捕获是指用括号括起来的部分),如果没有匹配到则返回 null
。
例如:
var str = "hello world";
var re = /(h\w+)\s(\w+)/;
var result;
while (result = re.exec(str)) {
console.log(result[1] + " " + result[2]);
}
这里我们使用一个 while 循环,每次执行 re.exec(str)
方法可以提取到一个匹配到的子串,直到不再匹配为止。控制台输出如下:
hello world
正则表达式实例
现在我们来看几个实际的例子,如何使用正则表达式截取字符串中的内容。
提取 URL 中的参数值
假设我们有一个 URL 为:
http://www.example.com/index.html?key1=value1&key2=value2&key3=value3
我们需要从中提取出所有的参数及对应的值。可以用以下代码实现:
var url = "http://www.example.com/index.html?key1=value1&key2=value2&key3=value3";
var reg = /(\w+)=(\w+)/g;
var result;
var params = {};
while((result = reg.exec(url)) != null) {
params[result[1]] = result[2];
}
console.log(params);
输出结果如下:
{
key1: "value1",
key2: "value2",
key3: "value3"
}
这里我们使用了正则表达式 (\w+)=(\w+)
,其中 \w
表示匹配字母、数字、下划线,符号 +
表示匹配一个或多个。使用 /g
表示全局匹配,循环执行 reg.exec(url)
方法可以逐个提取出所有匹配到的参数及其对应的值,保存在一个对象中。
截取 HTML 中的 图片链接
假设我们有一个 HTML 文本:
<html>
<head>
<title>HTML Example</title>
</head>
<body>
<img src="image1.jpg" /><br/>
<img src="image2.jpg" /><br/>
<img src="image3.jpg" /><br/>
</body>
</html>
我们需要从中提取出所有的图片链接。可以用以下代码实现:
var html = "<html><head><title>HTML Example</title></head><body><img src='image1.jpg' /><br/><img src='image2.jpg' /><br/><img src='image3.jpg' /><br/></body></html>";
var reg = /<img.+?src=('|")?([^'"]+)('|")?(?:\s+|>)/g;
var result;
var images = [];
while((result = reg.exec(html)) != null) {
images.push(result[2]);
}
console.log(images);
输出结果如下:
["image1.jpg", "image2.jpg", "image3.jpg"]
这里我们使用了正则表达式 <img.+?src=('|")?([^'"]+)('|")?(?:\s+|>)
,其中 .
表示匹配任意一个字符,+
表示匹配一个或多个,?
表示非贪心匹配(尽可能少地匹配),('|")?
表示匹配单引号或双引号,([^'"]+)
表示匹配一个或多个非单引号或双引号的字符,最后用 (?:\s+|>)
匹配图片标签的结束。
结论
正则表达式可以用来提取和匹配字符串,是一种非常强大的工具。在使用中需要注意正则表达式语法的细节,以及如何组合运用多个正则表达式来完成一些复杂的操作。