博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JS正则表达式
阅读量:6201 次
发布时间:2019-06-21

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

正则表达式

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑,许多程序设计语言都支持利用正则表达式进行字符串操作。主要有两种操作:匹配和捕获

正则表达式语法

正则表达式的创建

正则表达式是有元字符和修饰符组成,将元字符和修饰符写在" // "中。
eg: var reg = /d+/g;//意思是在全局中的多个数字

元字符:

  • \: 转义字符
  • ^: 以某一个元字符开始
  • $: 以某一个元字符结束
  • \n: 匹配一个换行
  • ".":除了\n以外的任意字符
  • (): 分组
  • x|y: x或者y中第一个
  • [xyz]:x或者y或者z中的一个
  • [^xyz]:除了三个以外的任意一个字符
  • [a-z]:a 和 z 之间的任意字符
  • [^a-z]:除了a 和 z 之间的任意字符
  • \d:表示 0-9 之间的数字
  • \D:除了0-9之间的数字以外的任意字符
  • \b:匹配一个边界符 w1 w2
  • \w:数字、字母、下划线中的任意字符 [0-9a-zA-Z_]
  • \s:匹配一个空白字符 空格、一个制表符、换页符...

量词元字符(数量元字符)

  • * :出现零到多次
  • +:出现一到多次
  • ?:出现零次或者一次
  • {n}:出现 n 次
  • {n,}:出现 n 到多次
  • {n,m}:出现 n 到 m 次

标志字符

  • g:全局搜索,记忆方式 global
  • i:不区分大小写,记忆方式 ignore
  • m:多行搜索

使用方式

正则对象的方法

1.test() 方法用于检测一个字符串是否匹配某个模式,若匹配,返回true,否则返回false
eg:手机号验证

2.exec()方法用于检索字符串中的正则表达式的匹配,若匹配,返回匹配值,否则返回false

匹配时,返回值跟 match 方法没有 g 标识时是一样的。数组第 0 个表示与正则相匹配的文本,后面 n 个是对应的 n 个捕获的文本,最后两个是对象 index 和 input同时它会在正则实例的 lastIndex 属性指定的字符处开始检索字符串 string。当 exec() 找到了与表达式相匹配的文本时,在匹配后,它将把正则实例的 lastIndex 属性设置为匹配文本的最后一个字符的下一个位置。有没有 g 标识对单词执行 exec 方法是没有影响的,只是有 g 标识的时候可以反复调用 exec() 方法来遍历字符串中的所有匹配文本。当 exec() 再也找不到匹配的文本时,它将返回 null,并把 lastIndex 属性重置为 0
var string = "2018.07.23";        var regex2 = /\b(\d+)\b/g;        console.log( regex2.exec(string) );        console.log( regex2.lastIndex);        console.log( regex2.exec(string) );        console.log( regex2.lastIndex);        console.log( regex2.exec(string) );        console.log( regex2.lastIndex);        console.log( regex2.exec(string) );        console.log( regex2.lastIndex);

其中正则实例lastIndex属性,表示下一次匹配开始的位置.比如第一次匹配了“2017”,开始下标是0,共4个字符,因此这次匹配结束的位置是3,下一次开始匹配的位置是4。

从上述代码看出,在使用exec时,经常需要配合使用while循环:
var string = "2018.07.23";        var regex2 = /\b(\d+)\b/g;        var result;        while ( result = regex2.exec(string) ) {            console.log( result, regex2.lastIndex );        }

图片描述

正则的匹配

字符匹配

精确匹配就不说了,比如/hello/,也只能匹配字符串中的"hello"这个子串。
正则表达式之所以强大,是因为其能实现模糊匹配。

匹配多种数量

var str = "cde cdde cddde cdddde cddddde";        var reg = /cd{3,5}e/g;        console.log(str.match(reg));

图片描述

贪婪性和懒惰性

贪婪:eg:

var str = "123";        var reg = /\d+/g;        console.log(reg.exec(str));

图片描述

懒惰("//"正则表达式末尾加上"?")eg:

var str = "123";        var reg = /\d+?/g;        console.log(reg.exec(str));

图片描述

匹配多种情况

用字符组[]来匹配多种情况,其他几种形式(dDsSwW)都可以等价成这种。eg:

替换

eg:

图片描述

读正则

不仅自己会写正则,还要读懂其他人写得正则

操作符的优先级是从上到下,由高到低的,所以在分析正则的时候可以根据优先级来拆分正则,比如 /ab?(c|de*)+|fg/
  • 因为括号是一个整体,所以/ab?()+|fg/,括号里面具体是什么可以放到后面再分析
  • 根据量词和管道符的优先级,所以a, b?, ()+和管道符后面的f, g
  • 同理分析括号里面的c|de => c和d, e

综上,这个正则描述的是

图片描述

总结

上面是我今天学习的内容,在这里分享给大家,有什么不对的可以留言给我,争取做到最好,希望大家有什么好的建议,好的文章也可以分享给我,我们共同努力!希望大家多多分享,下面是我的微信号码,有对前端感兴趣的朋友我们可以交流一下:

图片描述

转载地址:http://uuxca.baihongyu.com/

你可能感兴趣的文章
FISCO BCOS 2.0发布:新增群组架构克服吞吐瓶颈
查看>>
TOP 13大最热开源微服务Java框架
查看>>
Facebook智能摄像头Portal研发背后的那些事
查看>>
.NET Core 3.0特性初探:C# 8、WPF、Windows Forms、EF Core
查看>>
用Flink取代Spark Streaming,知乎实时数仓架构演进
查看>>
gRPC-Web发布,REST又要被干掉了?
查看>>
什么数据库最适合数据分析师
查看>>
Uber提出基于Metropolis-Hastings算法的GAN改进思想
查看>>
Handtrack.js 开源:3行JS代码搞定手部动作跟踪
查看>>
苏宁11.11:一种基于神经网络的智能商品税分类系统
查看>>
京东Vue组件库NutUI 2.0发布:将支持跨平台!
查看>>
随手记统一监控平台Focus设计解析
查看>>
聊天宝彻底凉了,遭罗永浩抛弃,团队就地解散
查看>>
通俗解释AWS云服务每个组件的作用
查看>>
Uber推出数据湖集成神器DBEvents,支持MySQL、Cassandra等
查看>>
百度智能小程序开源联盟成立,首批12家成员签约
查看>>
JS基金会发布Dojo 5,旨在开发更快、更小、更健壮的代码
查看>>
使用Ballerina构建API网关
查看>>
安卓架构组件1.0:Lifecycle、LiveData、ViewModel和Room
查看>>
移动APP测试之基础功能测试流程
查看>>