前言
正则表达式,是一种独立的语法结构,许多程序设计语言都支持利用正则表达式进行字符串操作。例如:在js
中我们会大量用于表单验证中,在python
中,当我们使用爬虫时会用正则表达式来判断出你所要爬取的网址,如果匹配那就会爬取。在js
中专门拥有属于自己的正则表达式,只是略有不同。
正则表达式是繁琐的,但它是强大的,学会之后的应用会让你除了提高效率外,会给你带来绝对的成就感。
正则表达式
作用:
- 测试字符串内的模式。
例如,可以测试输入字符串,以查看字符串内是否出现电话号码模式或信用卡号码模式。这称为数据验证。 - 替换文本。
可以使用正则表达式来识别文档中的特定文本,完全删除该文本或者用其他文本替换它。 - 基于模式匹配从字符串中提取子字符串。
可以查找文档内或输入域内特定的文本。
语法:
/正则表达式主体/修饰符(可选)
其中修饰符是可选的。例如:
var site = /baiDu/i;
其中/baiDu/i
是一个正则表达式。
baiDu
是正则表达式的主体,用于检索。
i
是一个修饰符,表示搜索时不区分大小写。
支持正则表达式的String
对象的方法
在JavaScript中,正则表达式可以用于四种字符串方法:search()
、replace()
、match()
和split()
。
search()
方法:使用表达式来搜索匹配,返回匹配的位置。replace()
方法:替换一个与正则表达式匹配的子串。match()
方法:可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配。split()
方法:用于把一个字符串分割成字符串数组。
search()
方法检索正则表达式:
var site = "www.baidu.com";
index = site.search(/baiDu/i);
console.log(index); // 4
replace()
方法检索替换正则表达式:
var site = "www.baidu.com";
newSite = site.replace(/baiDu/i, "taobao");
console.log(newSite); // www.taobao.com
match()
方法检索正则表达式
var site = "www.baidu.com";
var word = /baiDu/i;
console.log(site.match(word)); // "baidu", index = 4
split()
方法按正则表达式分隔:
var site = "www.taobAo.com";
arr = site.split(/a/i);
console.log(arr); // ["www.t", "ob", "o.com"]
正则表达式的修饰符
修饰符 | 描述 |
---|---|
i | 执行对大小写不敏感的匹配 |
g | 执行全局匹配(查找所有匹配,而非在找到第一个匹配后停止) |
m | 执行多行匹配 |
正则表达式模式
括号用于查找一定范围的字符串:
表达式 | 描述 |
---|---|
[abc] | 查找方括号之间的任何字符 |
[^abc] | 查找任何不在方括号内的字符 |
[0-9] | 查找从 0 到 9 的数字 |
[a-z] | 查找任何从小写 a 到小写 z 的字符 |
[A-Z] | 查找任何从大写 A 到大写 Z 的字符 |
[A-z] | 查找任何从大写 A 到小写 z 的字符 |
(x|y) | 查找由 | 分隔的任何选项 |
元字符是用于特殊含义的字符:
元字符 | 描述 |
---|---|
. | 查找单个字符,除了换行和行结束符 |
\w | 查找单词字符,即数字、字母和下划线 |
\W | 查找非单词字符 |
\d | 查找数字 |
\D | 查找非数字 |
\s | 查找空白字符 |
\S | 查找非空白字符 |
\b | 匹配单词边界 |
量词
量词 | 描述 |
---|---|
n+ | 匹配包含至少一个 n 的字符串 |
n* | 匹配包含零个或多个 n 的字符串 |
n? | 匹配包含零个或一个 n 的字符串 |
n{X} | 匹配包含 X 个 n 的序列的字符串 |
n{X,Y} | 匹配包含 X 至 Y 个 n 的序列的字符串 |
n{X,} | 匹配包含至少 X 个 n 的序列的字符串 |
n$ | 匹配任何结尾为 n 的字符串 |
^n | 匹配任何开头为 n 的字符串 |
?=n | 匹配任何其后紧接指定字符串 n 的字符串 |
?!n | 匹配任何其后没有紧接指定字符串 n 的字符串 |
使用RegExp对象
在 JavaScript 中,RegExp 对象是带有预定义属性和方法的正则表达式对象。
这里包含两个正则表达式方法test()
和exec()
。
test()
方法通过模式来搜索字符串,然后根据结果返回true
或false
:
其实没有必要将其赋值给一个变量,就意味着也可以这么写:let site = "www.taobao.com"; let word = /o/; let flag = word.test(site); console.log(flag); // true
console.log(/o/.test("www.taobao.com")); // true
exec()
方法通过模式搜索字符串,返回搜索到的文本,如果未找到,返回null
。console.log(/o/.exec("www.taobao.com")); // "o", index = 6 console.log(/x/.exec("www.taobao.com")); // null