当前位置: 首页 > news >正文

正则表达式小结

ES6部分参考阮一峰ES6标准入门

1. 基础知识

简单来讲,正则表达式是一些用来匹配和处理文本的字符串。

// pattern可以使用任何简单或复杂的正则表达式
// flags用以标明正则表达式的行为,每个正则表达式可以带有一个或多个标识
var expression = /pattern/flags
/name/     // 匹配纯文本name
/./        // 匹配任意字符(除换行符外的任意单个字符)
/\./       // 匹配特殊字符.(元字符的使用通常要在前面加上\,不确定是不是元字符,最好加上)
/[abcd]/   // 匹配abcd四个字符中的任一字符
/[0-9]/    // 利用字符集合区间,等价于[0123456789]
/[^0-9]/   // 取非字符,匹配除0-9数字外的任一字符

几个常用的类元字符

/\d/    // 任何一个数字字符(等价于[0-9])
/\D/    // 任何一个非数字字符(等价于[^0-9])
/\w/    // 任何一个字母数字字符(大小写均可)或下划线字符,等价于[a-zA-Z0-9_]
/\W/    // 任何一个非字母数字或下划线字符(等价于[^a-zA-Z0-9_])
/\s/    // 任何一个空白字符(等价于[\f\n\r\t\v])
/\S/    // 任何一个非空白字符(等价于[^\f\n\r\t\v])

2. 常见的标识符

g:表示全局模式,即模式将被用于所有字符串
i:表示不区分大小写模式
m:表示多行模式,即在到达一行文本末尾时还会继续查找下一行中是否存在与模式匹配的项

ES6新增了u修饰符和y修饰符
u:含义为‘Unicode模式’,用来正确处理大于uFFFF的Unicode字符

var s = '?';

/^.$/.test(s) // false
/^.$/u.test(s) // true

y: 表示‘粘连’修饰符,与g修饰符类似,也是全局匹配,后一次匹配都从上一次匹配成功的下一个位置开始。不同之处在于,g修饰符只要剩余的位置存在匹配就可以,而y修饰符会确保匹配必须从剩余的第一个位置开始。

var s = 'aaa_aa_a';
var r1 = /a+/g;
var r2 = /a+/y;

r1.exec(s) // ["aaa"]
r2.exec(s) // ["aaa"]

r1.exec(s) // ["aa"]
r2.exec(s) // null

3.重复匹配

+匹配一个或多个字符
*匹配零个或多个字符
?匹配零个或一个字符
{num}匹配num次重复
{a,b}匹配最少a次,最多b次(b可以为空,例如{a, })

*和+都是所谓的“贪婪型”元字符,它们在进行匹配时的行为模式是多多益善而不是适可而止的,会尽可能地从一段文本的开头匹配到这段文本的末尾。

举例:

var str = '<B>AK</B> and <B>HI</B>';
var pattern = /<[Bb]>.*<\/[Bb]>/g;
str.match(pattern);   // 输出['<B>AK</B> and <B>HI</B>']

这种情况下,可以使用这些元字符的“懒惰型”版本。

*  =>  *?
+  =>  +?
{n, } => {n, }?

var str = '<B>AK</B> and <B>HI</B>';
var pattern = /<[Bb]>.*?<\/[Bb]>/g;
str.match(pattern);   // 输出['<B>AK</B>', '<B>HI</B>']

4.位置匹配

单词边界:b用来匹配一个单词的开始或结尾,b匹配且只匹配一个位置,不匹配任何字符。

字符串边界:^用来匹配字符串的开头,$用来匹配字符串的结尾

Tips:^是几个有多重用途的元字符之一,只有当它出现在一个字符集合里(被放在[]之间,并紧跟在左方括号[的后面时,才能发挥“求非”的作用)。

5.回溯引用:前后匹配一致

回溯引用指的是模式的后半部分引用在前半部分定义的子表达式。(可以把回溯引用想象成变量)1代表模式里第一个子表达式,2代表第二个子表达式,以此类推。

举例:

var str = '<BODY><H1>hello</H1><H2>world</H2><H2>!</H3></BODY>';
var pattern = /<([Hh][1-6])>.*?<\/\1>/g;
str.match(pattern);  // 输出['<H1>hello</H1>', '<H2>world</H2>']

6.前后查找

向前查找(也称先行断言)指定了一个匹配但不在结果中返回的模式。实际上是一个子表达式,而且从格式上看也是如此。

从语法上看,一个向前查找模式其实是一个以 ?= 开头的子表达式,需要匹配的文本跟在=的后面。

(?=)     // 正向前查找
(?!)     // 负向前查找
(?<=)    // 正向后查找
(?<!)    // 负向后查找

正向前查找指的是,x只有在y前面才匹配,必须写成/x(?=y)/。比如,只匹配百分号之前的数字,要写成/d+(?=%)/。负向前查找指的是,x只有不在y前面才匹配,必须写成/x(?!y)/。比如,只匹配不在百分号之前的数字,要写成/d+(?!%)/。

/\d+(?=%)/.exec('100% of US presidents have been male')  // ["100"]
/\d+(?!%)/.exec('that’s all 44 of them')                 // ["44"]

向后查找正好与向前查找相反,x只有在y后面才匹配,必须写成/(?<=y)x/。比如,只匹配美元符号之后的数字,要写成/(?<=&dollar;)d+/。负向后查找则与负向前查找相反,x只有不在y后面才匹配,必须写成/(?<!y)x/。比如,只匹配不在美元符号后面的数字,要写成/(?<!&dollar;)d+/。

/(?<=\$)\d+/.exec('Benjamin Franklin is on the $100 bill')  // ["100"]
/(?<!\$)\d+/.exec('it’s is worth about €90')                // ["90"]

相关文章:

  • sql查询语句
  • [转] 梦里Babel知多少(一)
  • 性能测试 tps持续走低,响应时间持续增加,瓶颈分析
  • BZOJ1497 最大获利
  • 探秘varian:优雅的发布部署程序
  • 论“小猪佩奇如何从营销到吸金一路开挂前行”!
  • 使用mysqldump 备份 恢复从库报错解决方案(ERROR 1872)
  • Jquery mobiscroll 移动设备(手机)wap日期时间选择插件以及滑动、滚动插件
  • 动画小记——点击头像逐渐放大
  • Tuxera NTFS for Mac 拼团仅需¥99!再见原价¥298!
  • 什么样的项目适合自动化测试
  • leetcode-27. Remove Element
  • Spark进阶之路-Spark提交Jar包执行
  • 算法与数据结构1800题 数组和广义表(一)
  • JavaScript 函数式编程(二)
  • @jsonView过滤属性
  • [数据结构]链表的实现在PHP中
  • 「面试题」如何实现一个圣杯布局?
  • express + mock 让前后台并行开发
  • fetch 从初识到应用
  • HTTP中GET与POST的区别 99%的错误认识
  • interface和setter,getter
  • js学习笔记
  • js中的正则表达式入门
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • PHP的类修饰符与访问修饰符
  • select2 取值 遍历 设置默认值
  • SQL 难点解决:记录的引用
  • 仿天猫超市收藏抛物线动画工具库
  • 使用agvtool更改app version/build
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 项目管理碎碎念系列之一:干系人管理
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • 选择阿里云数据库HBase版十大理由
  • ​LeetCode解法汇总518. 零钱兑换 II
  • !!java web学习笔记(一到五)
  • #、%和$符号在OGNL表达式中经常出现
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (二)Linux——Linux常用指令
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (离散数学)逻辑连接词
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (转载)Google Chrome调试JS
  • .aanva
  • .gitignore
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET gRPC 和RESTful简单对比
  • .net mvc部分视图
  • .Net mvc总结
  • .net web项目 调用webService
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter