共计 1422 个字符,预计需要花费 4 分钟才能阅读完成。
正则表达式学习过屡次,然而过一阵子就遗记了,要用的时候又想不起来。明天抽空做了一下正则的整顿,不便当前的温习和查阅。
基础知识:
^ 向上尖头
当 ^ 放在 [] 外面,示意取反;放在 [] 里面,示意一行的字符串的结尾
eg: /^[^a-b]w+/
匹配不是 a 或 b 结尾的字符串
点号 .
在方括号里:匹配任意一个字符(除了 \n)
在方括号外:匹配任何字符。如果要想示意点号自身,要本义一下 .
\d
匹配数字,等价于[0-9]
\D
匹配一个非数字,等价于 [^0-9]
\s
匹配任何空白字符,包含空格、制表符、换页符等等。等价于 [\f\n\r\t\v]
\w
匹配数字或字母或下划线,等价于 [A-Za-z0-9_]
\W
匹配非数字和字母和下划线,等价于 [^A-Za-z0-9_]
星号 * ( 数量限定符 )
匹配后面的子表达式呈现 0 次或者有限次,等价于{0,}
加号 + (数量限定符 )
匹配后面的子表达式呈现 1 次或者屡次,等价于{1,}
?
匹配后面的子表达式呈现 0 次或者 1 次,等价于{0,1}
{m}
匹配后面的子表达式呈现 m 次
{m,} (数量限定符 )
匹配后面的子表达式至多呈现 m 次
{m,n}
匹配后面的子表达式呈现起码 m 次,最多 n 次
$
匹配字符串结尾
b
匹配单词的开始或完结
B
匹配单词的非开始和完结
方括号 []
[] 示意 ” 或 ” 逻辑
eg: [abc] 示意 a 或者 b 或者 c
括号 ()
独自应用: 示意分组
括号外面有 |:示意或逻辑
正向和反向断言
(?=pattern)
(?!pattern)
(?<=pattern)
(?<!pattern)
短线 - 在方括号中
当 - 在第一个字符时,示意自身;不在第一个字符时,示意区间 [a-p]
示意从 a 到 p
贪心匹配
贪心匹配:
正则表达式中蕴含数量修饰符时,会尽可能多的匹配字符。
/a.*b/,它将会匹配最长的以 a 开始,以 b 完结的字符串。比方字符串 aabab,它会匹配整个字符串。
将贪心匹配转化为懈怠匹配:
数量限定符后加问号
断言
正向必定:(?=pattern)
正向否定:(?!pattern)
反向必定:(?<=pattern)
反向否定:(?<!pattern)
断言能够叠加应用
登录明码的例子:
蕴含大小字母和数字,至多 8 位
let reg = /^(?=.*?[a-z])(?=.*?[A-Z])(?=.*?[d])[a-zA-Zd]{8,}/g
这个正则表达式,后面三个括号里是三个正向断言,即,字符串需满足,从结尾开始,满足 /.*?[a-z]/
,/.*?[A-Z]/
和 /.*?[d]/
。即同时满足。有大写字母,小写字母,数字。
正则的例子:
1,千分制表达式:
思路:找到三个数字后面的那个数,给这个数前面加个逗号
str.replace(/(d)(?=(d{3})+$)/g, function ($1) {console.log($1)
return $1 + ','
})
2, 手机号两头加掩码
思路:须要匹配的那一项,前面是四个数字
str.replace(/(d{3})(?=d{4}$)/, '***')
3,去掉前后的空格
办法一:
思路:字符串的结尾字符和开端字符
tip:如果每加 g 修饰符,将只会去掉 str 结尾的空格
str.replace(/(^s*)|(s*$)/g, '')
办法二:
思路:要匹配的那一项,前后是空格
tip:子项 (.*?) 中的问号不能去掉,去掉后会进行开端的空格将去不掉
str.replace(/^[s]*(.*?)[s]*$/, '$1')
前面会再补充一下非获取匹配 和 正则表达式的例子。