正则总结

正则

  • 元字符
    • 特殊含义的元字符
      \:转义符
      ^:开头
      $:结尾
      \n:匹配一个换行符
      .:除了\n以外的任意字符
      x|y :x或y中的一个
      [xyz]:xyz中的一个
      [^xyz]:除了三个以外的任何一个
      [a-z]:a-z之间的任何一个字符
      [^a-z]:除了a-z之间的任何一个字符
      \d:一个0-9之间的数字 \D:除了0-9之间的数字
      \b:匹配一个边界符
      \w:数字、字母、下划线中的任意一个
      \s:匹配一个空白字符 空格、一个制表符、换页符
      ():分组 把一个大正则分成几个小正则
    • 代表次数的量词元字符
      *:出现零到多次
      +:出现一到多次
      ?:出现零次或者一次
      {n}:出现n次
      {n,}:出现n到多次
      {n,m}:出现n到m次
  • 修饰符
    • g 全局匹配
    • i 忽略大小写
    • m 换行操作 多行操作

正则:用来操作字符串(匹配和捕获)的规则

  • 匹配: 看字符串是否符合我们制定的规则 reg.test()
  • 捕获: 把符合我们规则的字符串取出来 reg.exec()
    let reg = /\d/;
    console.log(reg.test('zsw123')); // ->true
    console.log(reg.test('zsw')); // ->false
    let reg2 = /\d+/g;
    console.log(reg2.exec('zsw123zsw456'));// ["123", index: 3, input: 
   "zsw123zsw456"]
    console.log(reg2.exec('zsw123zsw456'));// ["456", index: 9, input: 
   "zsw123zsw456"]

捕获正则有两大特点:

  • 懒惰性 解决:加全局g
  • 贪婪性 解决:量词+?

reg.exec() 用来捕获符合我们规则的字符串,每次只能捕获到一个,捕获到的这个是数组,数组总共包含三项:

  • 符合规则的字符串内容
  • 该内容开始的索引
  • input:原始字符串
    如果exec找不到符合规则的内容,返回值是null
    为何exec如果不加全局g的时候,每次都捕获到第一项?
    因为reg.lastIndex永远都是从0开始的
 // 懒惰型
    let reg = /\d+/;
    console.log(reg.exec('zsw123zsw456'));// ["123", index: 3, input: "zsw123zsw456"]
    console.log(reg.exec('zsw123zsw456'));// ["123", index: 3, input: "zsw123zsw456"]
// 加全局g
 let reg = /\d+/g;
    console.log(reg.exec('zsw123zsw456'));// ["123", index: 3, input: "zsw123zsw456"]
    console.log(reg.exec('zsw123zsw456'));// ["456", index: 9, input: "zsw123zsw456"]
// 贪婪性  量词后面加?
    let reg = /\d+?/g;
    console.log(reg.exec('zsw123zsw456'));// ["1", index: 3, input: "zsw123zsw456"]
    console.log(reg.exec('zsw123zsw456'));//["2", index: 4, input: "zsw123zsw456"]

[]的总结

  • []里面的特殊字符串没有没有特殊含义,代表的都是他本身的意思
  • []中不会出现两位数

?的总结

  • 量词 0或1
  • 解决正则的贪婪性的问题:量词+?
  • (?:)只匹配不捕获
    let reg=/(\d{2})(\d{2})/g;
    console.log(reg.exec('1234'));// ["1234", "12", "34", index: 0, input: "1234"]
    let reg2=/(\d{2})(?:\d{2})/g;  // ?:只匹配不捕获
    console.log(reg2.exec('1234'));// ["1234", "12", index: 0, input: "1234"]

():分组

  • 1:改变x|y的优先级 18或者19 /^(18|19)$/
  • 2.分组引用:\2代表和第一个分组出现一模一样的内容,\1和第一个分组出现一模一样的内容
let reg = /^(\w)\1(\w)\2$/
console.log(reg.test("zzff")) //->true
console.log(reg.test("z0f_")) // -> false
  • 3.分组捕获
    在分组中(?:)的作用是只匹配不捕获

match

match实现的核心原理就是利用exec分次捕获得到的

match和exec的区别

  • match一次性可以捕获到的所有符合正则规则的内容,放在一个新的数组返回
    exec每次只能捕获到一个符合规则的内容,并且以数组的形式返回,我们要的内容一般是数组的第一项
  • match不能进行小分组的捕获
    exec可以进行小分组的捕获,他的小分组从索引开始(从第二项开始)如果没有分组,exec数组中有3项

exec

  • 每次只能找到一项 数组
    • 这个数组在没有小分组的情况,拿到的是这个数组的只有3项:
      1.我们匹配到的内容;2.内容开始的索引;3.原始字符串
    • 这个数组如果有小分组
      1.我们匹配到的内容(符合大正则的内容);
      2.从第二项开始,一直到ary.length-2之前都是小分组捕获出来的内容;
      3.倒数第二项--索引
      4.最后一项:原始字符串
    let reg=/(\d{2})(\d{2})/g;
    console.log(reg.exec('1234'));// ["1234", "12", "34", index: 0, input: "1234"]

exec和match区别

  • exec存在小分组,但match没有
  • match一次性可以匹配到所有的内容,并且都放在一个数组中
    exec只能一次次的捕获
    exec和replace运用思想一模一样
    let reg = /(\d{2})(\d{2})/g;
    let str = 'abcd1234sad4567';
    console.log(reg.exec(str));// ["1234", "12", "34", index: 4, input: "abcd1234sad4567"]
    console.log(reg.exec(str));// ["4567", "45", "67", index: 11, input: "abcd1234sad4567"]
    console.log(str.match(reg));// ["1234", "4567"]

捕获

  • exec
  • match
  • replace

replace

  • 如果没有正则,replace只能一次次的去匹配和替换
  • 如果有正则,就可以批量替换
    replace的第二个参数,可以是个函数,函数的执行次数跟匹配成功的次数有关或
    let reg = /(\d{2})(\d{2})/g;
    let str = 'abcd1234sad1234';
    console.log(str.replace('1234','5678')); //abcd5678sad1234
    console.log(str.replace('1234','5678')); //abcd5678sad1234
    console.log(str.replace(reg,'5678'));//abcd5678sad5678

应用:
1.有效数字 正数、负数、零、小数
"."可以出现也可以不出现,但是一旦出现,后面必须跟一位或多位数字
最开始可以有+/ -也可以没有
整数部分,一位数可以是0-9之间的一个,多位数不能以0开头
/^[+-]?(\d|([1-9]\d+))(\.\d+)?$/
2.年龄介于18-65 (18-19 20-59 60-65)
/^(1[8-9]|[2-5]\d|6[0-5])$/
3.中国标准真实姓名 2-4位汉字
/^[\u4e00-\u9fa5]{2,4}$/
4.数字转大写

    let str = '20180520';
    let ary = ['零','壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];
    str = str.replace(/\d/g, function () {
        return ary[arguments[0]]
    });
    console.log(str); //贰零壹捌零伍贰零

5.解析url

let str = 'https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=baidu&wd=obj&oq=js&rsv_pq=9560a0460000df45&rsv_t=0cf=cn&rsv_enter=1&rsv_sug3=3&rsv_sug1=3&rsv_sug7=100&rsv_sug2=0&inputT=753&rsv_sug4=752';
    let reg = /([^?=&]+)=([^?=&]+)/g;
    let obj = {};
    str.replace(reg, function () {
        obj[arguments[1]] = arguments[2]
    });
    console.log(obj);

url.png

6.get-element-by-id转成getElementById

var str = 'get-element-by-id'
str.replace(/(?:-)([a-z])/g,function(){
          return arguments[1].toUpperCase()
})
// -> "getElementById"

7.手机号中间4位替换成*

var phone='15000001234'
var res=phone.replace(/(\d{3})(\d{4})(\d{4})/, "$1****$3")
// "150****1234"

8.姓名显示最后一字其他替换成星号

var name='张老三'
var res=name.replace(/.(?=.)/g,'*')
// "**三"
// (?=)可以理解为不占匹配位,不占匹配位就不会替换
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容