目录
概念
正则表达式是一组由字母和符号组成的特殊文本,它可以用来从文本中找出满足你想要的格式的句子。通俗的讲就是按照某种规则去匹配符合条件的字符串。
基础语法
single char(单个字符) | quantifiers(数量) | position(位置) |
---|---|---|
\d 匹配数字 | * 0个或者更多 | ^ 一行的开头 |
\w 匹配word(数字、字母) | + 1个或更多,至少1个 | $ 一行的结尾 |
\W 匹配非word | ? 0或1个 | \b 单词边界 |
\s 匹配white space(空格、tab等) | {min,max} min到max个 | |
\S 匹配非white space | {n} n个 | |
. 匹配任何字符 |
字符集
字符集也叫字符类,方括号用来指定一个字符集。在方括号中使用连字符来指定字符集的范围。在方括号中的字符集不关心顺序。
如 [abc] 匹配"你好a"中的a,匹配"adbc"中的a和b和c。
否定字符集
^用在方括号的开头的时候,表示这个字符集是否定的,如:
[^地]学习[^帅]
它学习好 //匹配
地学习不帅
它学习帅吗
一个特殊的用法:
正则表达式中点(.)是一个特殊字符,代表任意的单个字符,但是有两个例外。一个是四字节的UTF-16字符,这个可以用u修饰符解决;另一个是行终止符。
以下四个为行终止符:
- U+000A 换行符(
\n
) - U+000D 回车符(
\r
) - U+2028 行分隔符(line separator)
- U+2029 段分隔符(paragraph separator)
/foo.bar/.test('foo\nbar') //false
上面代码中因为.不匹配\n,所以返回false,ES2018引入s修饰符,使得.可以匹配任意单个字符。
/foo.bar/s.test('foo\nbar') //true
简写字符集
简写 | 描述 |
---|---|
. | 除换行符外的所有字符 |
\w | 匹配所有字母数字,等同于[a-zA-Z0-9_] |
\W | 匹配所有非字母数字 |
\d | 匹配所有数字,等同于[0-9] |
\D | 匹配所有非数字 |
\s | 匹配所有空格字符,等同于[\t\n\f\r\p] |
\S | 匹配所有非空格字符 |
\f | 匹配换页符 |
\n | 匹配换行符 |
\r | 匹配回车符 |
\t | 匹配制表符 |
\v | 匹配垂直制表符 |
\p | 匹配CR/LF(等同于\r\n),用来匹配DOS行终止符 |
重复次数
后面跟着元字符 * 、?或 + 的,用来指定匹配子模式的次数。
*
* 号匹配在 * 之前出现的字符出现0次或多次,例如:
[a-z]*
AAa 匹配
2233AAA
+
+ 号匹配在 + 之前出现的字符出现至少1次,例如:
\s+你好
你好 匹配
哦 你好呀 匹配
?
? 表示在 ? 之前出现的字符可选,即出现0或1次。
\s?你好
你好啊 匹配
你好啊 匹配
量词
{} 是一个量词,用来限定一个或一组字符可以重复出现的次数。
哈{2,3}
你哈哈 匹配
你哈哈哈 匹配
你哈
省略第二个参数时,表示至少出现n次
哈{2,}
你哈哈 匹配
你哈哈哈 匹配
你哈
省略逗号和第二个参数时,表示出现n次
哈{2}
你哈哈 匹配
你哈哈哈
你哈
特征标群
特征标群是一组写在 (...) 中的子模式。 (...) 中包含的内容将被看作一个整体。例如表达式 (ab)* 匹配连续0个或多个ab。(ab){3}匹配连续3个ab。
我们还可以用 | 在 () 中表示或,如 (学习|打工)的汪 匹配"打工的汪"或"学习的汪"
(你好)+啊
嘿你好啊 匹配
嘿啊
转义特殊字符
反斜线 \ 在表达式中用于转码紧跟其后的字符,用于指定 { } [ ] / \ + * . $ ^ | ? 这些特殊字符。如果想要匹配这些特殊字符,要在其前面加上反斜线 \ 。
你好\.
你好. 匹配
你好啊
边界
想要匹配指定开头或结尾的字符串就要使用到边界,^ 指定开头,$ 指定结尾。
^
^ 用来检查匹配的字符串是否在所匹配字符串的开头。
^哈哈
哈哈了 匹配
你哈哈
$
$ 用来检查匹配的字符串是否在所匹配字符串的结尾。
哈哈$
你哈哈 匹配
哈哈了
单词边界\b
单词边界是指 [a-zA-Z0-9] 之外的字符
\bis\b
a is b 匹配
a@is@b 匹配
你is猪 匹配
ais b
aisb
非单词边界 \B 与 \b 相反
零宽断言
先行断言和后发断言都属于非捕获簇。先行断言用于所匹配的格式是否在另一个确定的格式之前,匹配结果不包含该确定的格式。
例如(?<=\$)[0-9]*,匹配$开头,后面包含0到多个数字。
零宽断言如下:
符号 | 描述 |
---|---|
?= | 正先行断言-存在 |
?! | 负先行断言-排除 |
?<= | 正后发断言-存在 |
?<! | 负后发断言-排除 |
正先行断言
?=... 正先行断言,表示第一部分表达式之后必须跟着 ?=... 定义的表达式。
返回结果只包含满足匹配条件的第一部分表达式(即不会包含先行断言匹配部分的内容)。定义一个先行断言要使用 () ,在括号内部加一个 ? 和 = ,先行断言的内容写在后面。例如, 学习的汪(?=\shong) 首先匹配"学习的汪",然后在括号中我们又定义了正先行断言 (?=\shong),表示"学习的汪"后面紧跟着"(空格)hong"。
学习的汪(?=\shong)
学习的汪 hong 匹配到"学习的汪"
学习的汪 hon 不匹配
负先行断言
负先行断言?!用于筛选所有匹配结果,筛选条件为其后不跟随着断言中定义的格式。表达式 学习的汪(?!\shong) 首先匹配到"学习的汪",然后在括号中我们又定义了负先行断言 (?!\shong),即"学习的汪"后面不跟着"(空格)hong"。
学习的汪(?!\shong)
学习的汪 hong
学习的汪 匹配
学习的汪hong 匹配
正后发断言
正后发断言,记作 (?<=...) 用于筛选所有匹配结果,筛选条件为其前跟随者着断言中定义的格式。例如,表达式 (?<=[学习|打工])的汪 ,匹配"的汪",前面跟随"学习"或"打工"。
(?<=[学习|打工])的汪
学习的汪 匹配
打工的汪 匹配
打的的汪
负后发断言
负后发断言,记作 (?<!...) 用于筛选所有匹配结果,筛选条件为其前不跟随着断言中定义的格式。例如,表达式 (?<![学习|打工])的汪 ,匹配"的汪",前面不能跟随"学习"或"打工"。
(?<![学习|打工])的汪
学习的汪
打工的汪
打的的汪 匹配
运算符优先级
正则表达式从左到右进行计算,并遵循优先级顺序,这与算术运算符非常类似。
相同优先级的从左到右进行运算,不同优先级的运算先高后低。下表从最高到最低说明了各种正则表达式运算符的优先级顺序:
运算符 | 描述 |
\ | 转义符 |
(),(?:),(?=),[] | 圆括号和方括号 |
*,+,?,{n},{n,},{n,m} | 限定符 |
^,$,\任何元字符、任何字符 | 定位点和序列(即:位置和顺序) |
| | 替换,"或"操作 字符具有高于替换运算符的优先级,使得"m|food"匹配"m"或"food"。若要匹配"mood"或"food",请使用(m|f)ood |