博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
正则知识点
阅读量:6474 次
发布时间:2019-06-23

本文共 4572 字,大约阅读时间需要 15 分钟。

正则

常用元字符

元字符 含义
\ 转义符
^ 开头
$ 结尾
\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")) //->trueconsole.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);复制代码

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,'*')// "**三"// (?=)可以理解为不占匹配位,不占匹配位就不会替换复制代码

转载于:https://juejin.im/post/5c904e18f265da61003d2ab5

你可能感兴趣的文章
云服务应用开发所面临的9大挑战
查看>>
各大互联网公司架构演进之路汇总
查看>>
PostgreSQL汉字转拼音
查看>>
了解ASP.NET MVC几种ActionResult的本质:FileResult
查看>>
一位资深程序员大牛给予Java初学者的学习路线建议
查看>>
753个大奖邀请各位新老博主入驻云栖,请技术人员广而告之
查看>>
恩信科技:市场为什么需要云计算ERP
查看>>
《Linux From Scratch》第三部分:构建LFS系统 第六章:安装基本的系统软件- 6.1. 简介...
查看>>
阻碍云实例优化的5个常见问题
查看>>
ICOME2013见证数据科学家和创业者诞生
查看>>
F5:致力提升与中国云服务商合作力度
查看>>
WebX实践指南_持久化(三)
查看>>
中国科学院声学研究所研究员侯自强:SDN/NFV+5G
查看>>
2016北京车展get新神器 高德室内地图帮您hold住“靓”点
查看>>
公瑾财务为微昊科技“看好后院”
查看>>
Windows内核再次出现0Day漏洞 影响win2000到win10所有版本 反病毒软件恐成瞎子
查看>>
5G重塑网络 构建新生态下的大互联
查看>>
趋势科技技术分析:详解无文件勒索病毒Sorebrect
查看>>
H3C品牌刀片系统强势首发
查看>>
江门交警与高德地图战略合作引导市民智慧出行
查看>>