谈谈正则表达式

网友投稿 231 2022-11-29

谈谈正则表达式

正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。

嗯~那就是:

正则表达式描述规则正则表达式作用于字符串

本博文仅仅是自己阅读的笔记...

基础语法的东西,记住下相关的英文就比较好理解了,比如: ​​digit​​​指的是数字[0-9],转换为正则关键字为​​\d​​​,而其大写​​\D​​则表示非digit,即非[0-9]。

^和[^regex]

​​^​​​这个是放在规则的前面,表示是匹配的开头。​​[^regex]​​也就是逻辑非。

console.log((/^I am/).test('I am a teacher.')); // true

console.log((/[^\d]/).test('aa')); // true

[\b]和\b

​​[\b]​​​表示的是回退符​​backspace​​​;而​​\b​​​表示的是单词边界​​border​​。

let str = 'teacher\b';console.log(/[\b]/.test(str)); // true

let str = 'I am a teacher.'console.log(str.replace(/\bam\b/, 'am not')); // 'I am not a teacher'

let str = 'Mike is a teacher. And Mike love this job!'let pattern = /\bmike\b/gi;console.log(str.replace(pattern, 'Jay')); // 'Jay is a teacher. And Jay love this job!'

集合区间[]

集合的区间是使用中括号​​[​​​和​​]​​​。上面说的​​[\b]​​是回退符可以特殊对待。

console.log(/[a-z]/.test('bb')); // trueconsole.log(/[a-z]/.test('BB')); // false

分组()

所有以​​(​​​和​​)​​元字符所包含的正则表达式被分为一组,每一个分组都是一个子表达式。

分组分类型有​​捕获型()​​​,​​非捕获型(?:)​​​,​​正向前瞻型(?=)​​​和​​反向前瞻型(?!)​​等。

捕获型(pattern)

匹配结果会存储在缓冲区内供以后使用。

let dateStr = '2019/07/16';let reg = /(\d{4})\/(\d{2})\/(\d{2})/;dateStr = dateStr.replace(reg, '$1-$2-$3');console.log(dateStr); // "2019-07-16"

非捕获型(?:pattern)

将​​pattern​​部分组合成一个可统一操作的组合项,但不把这部分内容作为子匹配捕获,匹配的内容部进行编号也不存储在缓冲区中供以后使用。非捕获性分组方法在必须进行组合、但又不想对组合的部分进行缓存的情况下非常有用。

例如在一篇文章中找​​program​​​和​​project​​​两个单词,正则表达式可以表示为​​/program|project/​​​,也可以表示为​​/pro(gram|ject)/​​,但是缓存子匹配(gramject)没有意义,就可以用/pro(?:gram|ject)/进行非捕获性匹配这样既可以简洁匹配又可不缓存无实际意义的字匹配。

let dateStr = '2019/07/16';let reg = /(?:\d{4})\/(\d{2})\/(\d{2})/;dateStr = dateStr.replace(reg, '$1-$2-$3');console.log(dateStr); // "07-16-$3"console.log(RegExp.$3); // ''

正向前瞻型(?=pattern)

在目标字符串的相应位置必须有pattern部分匹配的内容,但不作为匹配结果处理,更不会存储在缓冲区内供以后使用。

比较好的说明:​​你站在原地往前看,如果前方是指定的东西就返回true,否则为false​​。

let str = 'I am a teacher';let pattern = /I am a (?=teacher)/console.log(pattern.test(str)); // trueconsole.log(RegExp.$1); // ''

反向前瞻型(?!pattern)

比较好的说明:​​你站在原地往前看,如果前方不是指定的东西就返回true,否则为false​​。

let str = 'I am a teacher';let pattern = /I am a (?!teacher)/console.log(pattern.test(str)); // falseconsole.log(RegExp.$1); // ''

引用​​$1,$2...​​

上面中分组已经说到,对一个正则表达式模式或部分模式两边添加圆括号将导致这部分表达式存储到一个临时缓冲区中。可以使用非捕获元字符 ​​?:​​​, ​​?=​​​, 或者 ​​?!​​ 来忽略对这部分正则表达式的保存。

所捕获的每个子匹配都按照在正则表达式模式中从左至右所遇到的内容存储。存储子匹配的缓冲区编号从1开始,连续编号直至最大99个子表达式。

你可以使用​​$1, $2...​​进行逐个的匹配访问,比如:

let dateStr = '2019/07/16';let reg = /(\d{4})\/(\d{2})\/(\d{2})/;reg.test(dateStr);console.log(RegExp.$1); // 2019console.log(RegExp.$2); // 07console.log(RegExp.$3); // 16

参考

​​维基百科-正则表达式​​

​​codepen.io/​​ 代码验证

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:HDU 1421:搬寝室
下一篇:Java中控制流程语句的深入讲解
相关文章

 发表评论

暂时没有评论,来抢沙发吧~