正则表达式截取字符串
正则表达式是一种用来描述、匹配一定模式文本的工具,可以实现从字符串中截取出我们需要的内容。在字符串处理中,正则表达式是一个非常重要的工具,应用广泛。本文将详细介绍如何使用正则表达式截取字符串。
正则表达式语法
正则表达式是由字符和操作符组成的字符串,用于匹配文本中的字符模式。其中一些特殊字符被称为 “元字符”,它们具有特殊的含义,用于描述模式。下表是几种常用的特殊字符:
| 字符 | 描述 |
|---|---|
| . | 匹配任意一个字符 |
| [] | 匹配括号内的任意一个字符,如[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+|>) 匹配图片标签的结束。
结论
正则表达式可以用来提取和匹配字符串,是一种非常强大的工具。在使用中需要注意正则表达式语法的细节,以及如何组合运用多个正则表达式来完成一些复杂的操作。
极客笔记