接着开新坑,之前正则基本上是不会,想用啥直接google但毕竟不是个长久之计。所以第二篇我决定搞正则。、
参考资料有:MDN正则表达式部分、阮一峰的 ECMAScript 6 入门、JavaScript高级程序设计 —— RegExp类型
创建正则表达式
正则表达式字面量
1 | let re = /ab+c/ |
使用正则表达式字面量方法为正则表达式提供了脚本加载后的编译。当正则表达式保持不变时,使用此方法可获得更好的性能。
RegExp 对象的构造函数
1 | let re = new RegExp('ab+c') |
使用构造函数为正则表达式提供了运行时的编译。使用构造函数的方式,当你知道正则表达式的模式将会改变,或者不知道模式,并且从其他来源获取他(如:用户输入)
使用正则表达式
使用简单模式
简单模式是由你想直接找到的字符串构成. 如:/asd/ 这个模式能且只能匹配’asd’按照顺序同时出现的情况。
使用特殊字符串
断言
表示一个匹配在某些条件下发生。断言包含先行断言、后行断言和条件表达式。
便边界
表示行和单词的开始和结尾
字符串类别
区分不同类型的字符串,例如区分字母和数字。
组和范围
表示表达式字符的分组和范围
量词
表示匹配的字符串或表达式的数量。
Unicode属性转义
基于 unicode 字符属性区分字符。例如大写和小写字母、数字符号和标点。
###正则表达式中的特殊字符
\
含义:在非特殊字符之前的反斜杠表示下个字符是特殊字符。在特殊字符之前的反斜杠表示下一个字符不是特殊字符,应该按照字面理解。如果你想将字符串传递给RegExp构造函数,不要忘记在字符串字面两种反斜杠是转义字符。所以为了在模式中添加一个反斜杠,需要在字符串字面量中转义它。
^
含义:匹配输入的开始。如果多行标志被设置为true,那么也匹配换行符后紧跟的位置。
如:/^A/ 不会匹配’anA’,会匹配’Ana’
$
匹配输入的结束。如果多行标示被设置为true,那么也匹配换行符前的位置。
如:/$A/ 会匹配’anA’,不会匹配’Ana’
*
匹配前一个表达式零次或多次。等价于{0,}。
如/bo*/ 可以匹配 ‘booooo’、可以匹配 ‘bxxxxxxxxx’(不完全匹配 0次)、不匹配 ‘oooooox’(因为从b开始匹配,然而却没有b)所以不匹配。
+
匹配前面一个表达式一次或者多次。等价于{1,}。
如:/bo*/ 可以匹配 ‘booooo’、可以匹配 ‘bxxxxxxxxx’(不匹配)、不匹配 ‘oooooox’(因为从b开始匹配,然而却没有b)所以不匹配。
?
匹配前面一个表达式0次或者1次。等价于{0,1},如果**紧跟在任何量词 * + ? 或 {} 的后面将会使两次变成非贪婪(匹配尽量少的字符),和缺省使用的贪婪模式(匹配尽量多的字符)正好相反。
. (小数点)
默认匹配除换行之外的任何单个字符。
如:/.n/将会匹配”nay, an apple is on the tree”中的’an’和’on’,但不会匹配’nay’(因为n之前没有字符)
(?:x)
匹配’x’但是不记住匹配项。这种括号叫做非捕获括号。是的你能够定义与正则表达式运算符一起使用的子表达式。
x(?=y)
匹配’x’仅仅当’x’后面跟着’y’。这种叫做先行断言。
(?<=y)x
匹配’x’仅仅当’x’前面是’y’。这种叫做后行断言。
x(?!y)
仅仅当’x’后面不跟着’y’时匹配’x’,这被称为正向否定查找。
(?<!y)x
仅仅当’x’前面不是’y’时匹配’x’,这被称为反向否定查找。
x|y
匹配’x’或者’y’
{n}
n是一个正整数,匹配前一个字符刚好出现了N次。
{n,}
n是一个正整数,匹配前一个字符至少出现了n次。
{n,m}
n,m都是整数。匹配前面的支付至少n次,最多m次。如果n或者m的值是0,这个值将被忽略。
[xyz]
一个字符集合。匹配方括号中的任意字符,包括转译序列。也可以用使用 - (破折号)来指定一个字符范围。
如:[abcde] = [a-e] 他们都匹配‘brisket’中的‘b’,也都匹配‘city’中的‘c’。
[^xyz]
一个反向字符集。也就是说,它匹配任何没有包含在方括号中的字符。在这里也能使用 - (破折号)来指定一个字符范围。
[\b]
匹配一个退格(U+0008)
\b
匹配一个字符边界。一个词的边界就是一个次不被另一个“字”跟随(前面或者后面存不存在字符)
如:‘moon’ /\bm/匹配‘moon’中的‘m’ 、 /oo\b/不匹配‘moon’中的‘m’、/oon\b/匹配‘moon’中的‘oon’ 因为‘oon’是这个字符串的结束部分,这样他没有被一个”字”紧跟着
\B
匹配一个非单词边界
- 字符串第一个字符为非”字”字符
- 字符串最后一个字符为非“字”字符
- 两个单词字符之间
- 两个非单词之间
- 两个非单词字符之间
- 空字符串
如:/\B../匹配‘nond0ay’中的‘on’,而/y\B../匹配“possibly yesterday”中的“yes”
/cX
当X是处于A到Z之间的字符的时候,匹配字符串中的一个控制符。
如:/\cM/ 匹配字符串中的control(键盘)+M
\d
匹配一个数字。等价于[0-9]
/\d/与/[0-9]/匹配“B2 is the suite number”中的2
\D
匹配非数字字符。等价于[^0-9]
/\D/与/[0-9]/匹配“B2 is the suite number”中的B
\f
匹配一个换页符(U+000C)
\n
匹配一个换行符(U+000A)
\r
匹配一个回车符(U+000D)
\s
匹配一个空白字符。包括空格、制表符、换页符、和换行符。
\S
匹配一个非空白字符。
\w
匹配一个单字字符(数字、字母、下划线)等价于[A-Za-z0-9_]
\W
匹配一个非单字字符(数字、字母、下划线)等价于[^A-Za-z0-9_]
\n
在正则表达式中,他返回最后的第n个字捕获匹配的字符串
如:/apple(,)\sorange\1/ 匹配”apple, orange, cherry, peach.”中的’apple, orange,’ 。
使用正则表达式
正则表达式可以被用于RegExp的exec和test方法以及String的match、replace、search和split方法。
exec
一个在字符串执行查找匹配的RegExp方法,他返回一个数组(未匹配到则返回null)
1 | let reg = /[^A-Za-z0-9_]/ |
test
一个在字符串中测试是否匹配的RegExp方法,它返回 true 或 false
1 | let reg = /[^A-Za-z0-9_]/ |
match
在一个字符串中执行查找匹配的String方法,它返回一个一个数组,在未匹配到时候返回null。
1 | let reg = /[^A-Za-z0-9_]/ |
matchAll
1 | const regexp = RegExp('foo*','g'); |
search
一个在字符串中测试匹配的String方法,他返回匹配到的位置索引,或者在失败时返回-1.
1 | let text = 'dsad dff deeq xccc jj ww~ @ # 004' |
replace
一个在字符串中执行查找匹配的String方法,并且使用替换字符串替换掉匹配到的子字符串。
1 | let text = 'dsad dff deeq xccc jj ww~ @ # 004' |
(此处存在一个疑问)[https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/search]
split
一个使用正则表达式或者一个固定字符串分割一个字符串,并且将分割后的子字符串存储到数组中的String方法。
1 | let text = 'dsad dff deeq xccc jj ww~ @ # 004' |
正则表达式标志
g
全局匹配,后一次匹配都从上一次匹配成功的下一个位置开始。
i
不区分大小写搜索
m
多行搜索
s
允许.匹配换行符
u
使用unicode码的模式进行匹配。Unicode 模式 用来处理大于\uFFFF的Unicode字符。也就是说会正确处理四个字节的 UTF-16 编码。
y
执行”粘性”搜索,匹配从目标字符串的当前位置开始,可以使用y标志。与 g 的不同 g修饰符只要剩余位置中存在匹配就可以,而 y 修饰符确保匹配必须从剩余的第一个位置开始,这也就是“粘连”的含义。
1 | let s ='aaa_aa_a' |