duyue6002 / Blog

:pencil2: Write here
http://duyue6002.github.io/Blog/#/
5 stars 1 forks source link

[总结]学习正则表达式 #19

Open duyue6002 opened 5 years ago

duyue6002 commented 5 years ago

CheatSheet

MDN 可视化网站 在线测试 0001

duyue6002 commented 5 years ago

基础用法

基本语法

[xzy], [^xyz], \s, \S, \d, \D, \w, \W, \b, . 都是匹配一个字符。 注:[a-z-]匹配的是a~z+-

标志位

/a/g, /a/i, /a/m 分别对应全局匹配、不分大小写、匹配换行

JS的API

RegExp

RegExp.prototype.exec() 在捕获时用,reg实例有lastIndex属性,记录上一次匹配位置,下次匹配就从这里开始。

String

  1. String.prototype.match(//))设置全局返回数组,不设置全局返回RegExp.prototype.exec()结果。
  2. String.prototype.split(//)) 在除去多位空格时很方便

    量词

  3. * = {0,}
  4. ? = {0,1}
  5. + = {1,}
duyue6002 commented 5 years ago

进阶用法

贪婪匹配和惰性匹配

默认是贪婪匹配,选择长的匹配。 在量词后面?就是惰性匹配,选择短的匹配。

分组和捕获

加了小括号就是捕获型数组,会被保存。为了不被捕获,在括号开头加(?:)。 注:(a|b)会自动生成子数组

引用捕获数组

引用

RegExp对象:RegExp.$n String对象:String.prototype.replace(/r(e)g/, "$1")

反向引用

当有分组当时候\1代表引用第一个分组,在正则表达式中就可以使用。 \w+(?=\.(jpg|png|gif))\.\1匹配图片名

条件/过滤

正向前瞻

(?=) 后面跟条件字符,=后面不需要加(),返回的不是条件,而是符合条件的字符。如果需要返回条件字符,加()获得捕获数组。

反向前瞻

(?!),跟正向语法相同。

duyue6002 commented 5 years ago

技巧

对整体匹配/从后往前匹配

?= 放到前面作为匹配项

  1. 数字添加千分位
    "1234567890.12".replace(/(?=(\B\d{3}))+($|\.)/, ",");    // 匹配后面有3位数字的那些""且""不为边界
  2. 检验密码组成(至少有一个大写,一个小写,一个数字,共8-15位)
    "jfioIWK430".match(/(?=(.*\d))(?=(.*[A-Z]))(?=(.*[a-z])).{8,15}/);

    匹配HTML标签

    /<(\/?[^\>]+)>/g

    日期

    21/3/2019 - /\d{1,2}\/\d{1,2}\/\d{4}/

    颜色的表达

    #eee或#ffffff - #[A-Za-z0-9]{3}([A-Za-z0-9]{3})?