简介
正则表达式(regular expression)是一种字符串匹配模式(pattern),用来搜索、替换或取出符合某个条件的子字符串。1
语法
正则表达式由普通字符(例如字符 a 到 z)以及特殊字符(称为“元字符”)组成。
普通字符
包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号。
字符 | 描述 |
---|---|
[ABC] | 匹配 […] 中的所有字符。 |
[^ABC] | 匹配除了 […] 中字符的所有字符。 |
[A-Z] | [A-Z] 表示一个区间,匹配所有大写字母,[a-z] 表示所有小写字母。 |
. | 匹配除换行符 \n 之外的任何单字符。 |
[\s\S] | 匹配所有。\s 是匹配所有空白符,包括换行,\S 非空白符,不包括换行。 |
特殊字符
所谓特殊字符,就是一些有特殊含义的字符。
字符 | 描述 |
---|---|
[ | 标记一个中括号表达式的开始。 |
{ | 标记限定符表达式的开始。 |
\ | 将下一个字符标记为 特殊字符、原义字符、向后引用或八进制转义符。 |
限定符
限定符用来指定一个条件要出现多少次才能匹配。有 ?
*
+
和{n}
{n,}
{n,m}
共6种。
字符 | 描述 |
---|---|
? | 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。 |
* | 匹配前面的子表达式零次或多次。 |
+ | 匹配前面的子表达式一次或多次。 |
{n} | n 是一个非负整数。匹配确定的 n 次。 |
{n,} | n 是一个非负整数。至少匹配n 次。 |
{n,m} | m 和 n 均为非负整数。最少匹配 n 次且最多匹配 m 次。 |
注意:限定符都是贪婪的,它们会尽可能多的匹配文字,在它们的后面加上一个 ? 就可以实现非贪婪或最小匹配。
<h1>RUNOOB-菜鸟教程</h1>
// 贪婪:下面的表达式匹配从开始 (<) 到 (>) 之间的所有内容。
/<.*>/
// 非贪婪:下面的表达式只匹配 <h1>。
/<.*?>/
定位符
定位符用来描述字符串或单词的边界,^
和 $
分别指字符串的开始与结束,\b
描述单词的前或后边界,\B
表示非单词边界。
字符 | 描述 |
---|---|
^ | 匹配输入字符串的开始位置。在方括号表达式中使用时,表示不接受该方括号表达式中的字符集合。 |
$ | 匹配输入字符串的结尾位置。 |
\b | 匹配一个单词边界,即字与空格间的位置。 |
\B | 非单词边界匹配。 |
选择
()
表示捕获分组,把每个分组里的匹配的值保存起来,相邻的选择项之间用 |
分隔。
?:
?=
?!
是非捕获元。
字符 | 描述 |
---|---|
(pattern) | 匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到。 |
(?:pattern) | 匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。 |
(?=pattern) | 正向肯定预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。exp1(?=exp2) :查找 exp2 前面的 exp1。 |
(?!pattern) | 正向否定预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。exp1(?!exp2) :查找后面不是 exp2 的 exp1。 |
(?<=pattern) | 反向肯定预查,与正向肯定预查类似,只是方向相反。(?<=exp2)exp1 :查找 exp2 后面的 exp1。 |
(?<!pattern) | 反向否定预查,与正向否定预查类似,只是方向相反。(?<!exp2)exp1 :查找前面不是 exp2 的 exp1。 |
x|y | 匹配 x 或 y。 |
\num | 匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,‘(.)\1’ 匹配两个连续的相同字符。 |
// (?:pattern)
industr(?:y|ies) // 比 'industry|industries' 更简略的表达式。
// (?=pattern)
Windows(?=95|98|NT|2000) // 能匹配"Windows2000"中的"Windows",但不能匹配"Windows3.1"中的"Windows"。
// (?!pattern)
Windows(?!95|98|NT|2000) // 能匹配"Windows3.1"中的"Windows",但不能匹配"Windows2000"中的"Windows"。
// (?<=pattern)
(?<=95|98|NT|2000)Windows // 能匹配"2000Windows"中的"Windows",但不能匹配"3.1Windows"中的"Windows"。
// (?<!pattern)
(?<!95|98|NT|2000)Windows // 能匹配"3.1Windows"中的"Windows",但不能匹配"2000Windows"中的"Windows"。
反向引用
()
将相关匹配存储到一个临时缓冲区中,所捕获的子匹配从左到右的顺序存储。缓冲区编号从 1 开始,最多可存储 99 个。缓冲区使用 \n
访问,其中 n 为一个标识特定缓冲区的十进制数。
// 反向引用常用于查找文本中两个相同的相邻单词。
var str = "Is is the cost of of gasoline going up up";
var patt1 = /\b([a-z]+) \1\b/igm; // 第二部分是对以前捕获的子匹配项的引用,\1 指定第一个子匹配项。
document.write(str.match(patt1));
// Is is,of of,up up
var str = "https://www.runoob.com:80/html/html-tutorial.html";
var patt1 = /(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/;
arr = str.match(patt1); // str.match(patt1) 返回一个数组,索引 0 对应的是整个字符串,索引 1 对应第一个匹配符
for (var i = 0; i < arr.length ; i++) {
document.write(arr[i]);
document.write("<br>");
}
// https://www.runoob.com:80/html/html-tutorial.html
// https
// www.runoob.com
// :80
// /html/html-tutorial.html
修饰符(标记)
标记不写在正则表达式里,标记位于表达式之外,格式 /pattern/flags
修饰符 | 含义 |
---|---|
i | ignore - 不区分大小写 |
g | global - 全局匹配 |
m | multi line - 多行匹配 |
s | 特殊字符圆点 . 中包含换行符 \n |
var str="Google runoob taobao runoob";
var n1=str.match(/runoob/); // 查找第一次匹配项
var n2=str.match(/runoob/g); // 查找所有匹配项
元字符
下面是一些其他常用字符。
字符 | 描述 |
---|---|
\w | 匹配字母、数字、下划线。等价于’[A-Za-z0-9_]'。 |
\W | 匹配非字母、数字、下划线。等价于 ‘[^A-Za-z0-9_]’。 |
\d | 匹配一个数字字符。等价于 [0-9]。 |
\D | 匹配一个非数字字符。等价于 [^0-9]。 |
\s | 匹配任何空白字符,包括空格、制表符、换页符等等。 |
\S | 匹配任何非空白字符。 |