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

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

预定义字符类

.(点好): 匹配除了换行符和其他Unicode行终止符(如回车符)之外的任意字符,等价于[^\n\r]\w: 匹配任何ASII单字字符,等价于[a-zA-Z0-9_]\W: 匹配任何非ASII单字字符,等价于[^a-zA-Z0-9_]\s: 匹配任何Unicode空白符,等价于[\t\n\x0B\f\r]

贪婪匹配

概念:如星号(*)元字符在执行匹配时,先看整个字符串是否匹配,如果不匹配则去掉该字符串中的最后一个字符,并再次尝试。

1.?、{n}和{n,m}重复类

这三个都具有弱贪婪性,主要表现在贪婪性具有有限性。对于?匹配,在选择匹配还是不匹配时,如果条件允许,它总是会选择匹配而不是不匹配;{n,m}在条件允许的情况下,匹配m次,而不是n次。正则式的贪婪性是在遵循匹配条件基础上尽可能占有更多的字符,而不是随意占用。

2.*、+和{n,}重复类

这三个具有强贪婪性,这种贪婪表现为贪婪的无限性
  • 星号(*)重复类的匹配底线是最宽容的,匹配欲望是最强烈的。不管是否存在指定字符或子表达式都会执行匹配操作

  • 加号(+)重复类的匹配底线是最少存在一个符合指定条件的字符或子表达式,否则不予执行匹配操作

  • {n,}重复类的匹配底线是最灵活的,执行任意底线和条件的无限贪婪的匹配操作。

正则表达式是有贪婪性的,它总是与最长的长度匹配,而且越是排在左侧的重复类匹配符优先级就越高。

var s = "";var r = /(<.*>)(<.*>)/var a = s.match(r);alert(a[1])//alert(a[2])//

上面的演示说明,当多个重复类并列子在一起时,左侧重复类具有较大的优先权,并尽可能的占有更多的符合条件的字符。

惰性匹配

惰性匹配它将先查看字符串中的第一个字符是否匹配,如果匹配条件不够,就读入下一个字符。如果还是匹配不足够,惰性匹配会继续从字符串中读取字符串直到发现匹配或者整个字符串都检查过也没有匹配为止。惰性匹配只需要在重复类后面添加问号(?)就可以了。问号必须放在重复字符串后面。

贪婪匹配体现了最大化匹配原则,那么惰性匹配体现了最小化匹配原则。但不管是那种匹配都必须保证匹配满足正则表达式基本条件。

  • {n,m}?: 正则表达式尽量匹配n次,但是为了满足匹配条件也可能最多重复m次

  • {n}?: 正则表达式尽量匹配n次;

  • {n,}?: 尽量匹配n次,但为了满足匹配条件也可能匹配任意次

  • ??: 正则表达式尽量匹配,但是为了满足匹配条件也可能多次匹配1次,相当于{0,1}?

  • +?: 尽量匹配1次,但是为了满足匹配条件也可能匹配任意次数,相当于{1,}?

  • *?:相当于{0,}?

支配匹配(浏览器兼容不强)

这个是另一种类型的匹配模式,它的算法是:只匹配整个字符串。如果整个字符串不能匹配,则会自动放弃匹配,不再执行迭代以求进一步尝试。支配匹配只需要在重复类后面添加加号(+)即可。

高级匹配模式

1.分组:就是通过用小括号来包含一系列字符、字符类,或者重复类量词,以实现处理各种特殊的字符序列

通过小括号逻辑分隔符,实现分别储存每个被匹配的标签,最后通过这个数组类获取每个标签的名称。小括号表示一个独立的逻辑域,其匹配的内容将被独立存储。
分组的应用价值

  • 把单独的项目进行分组,以便合成子表达式,这样就可以像处理yi个独立的字符那样,使用|、+、*或?等字符来处理他们。

  • 在正则表达式中,通过分组可以在一个完整的模式中定义子模式。当一个正在表达式成功地与目标字符串匹配时,也可以从目标字符串中抽出与小括号中的子模式相匹配的部分。

var s = "ab=21,bc=45,cd=43";var r = /(\w+)=(\d+)/;var a = s.match(r); ["ab=21","ab","21"]
  • 在同一个正则表达式的后部分可以引用前面的子表达式。这是通过在字符“”后加一位或多位数字实现的。数字指定了带括号的子表达式在正则表达式中的位置

var s = "

title

text

"var r = /(<\/?\w+>).*\1/g;var a = s.match(r);//["

title

","

text

"]

非引用型分组

正则表达式分组会占用一定的系统资源,在较长的正则表达式中,存储反向引用会降低匹配速度。创建非引用型分组的方法是,在括号的后面分别加上一个问号和冒号。(?:w*?)

声明

正则表达式用来声明正则表达式在什么条件下才能匹配,或者不在什么条件下才会匹配,这种声明包括正前向声明和反向前声明两种模式

  • 正前向声明是指匹配模式后面的字符,声明表示条件的意思,也是指定在接下来的字符必须被匹配,但并不真正进行匹配。通俗的讲,就是指定可能执行匹配操作的条件,该条件作为正则表达式的匹配模式一部分而存在,但是不会真正使用该条件去执行匹配。

var s = "a:123 b=345";var r = /\w*(?==)/;var a = s.match(r);//["b"]
  • 反前向声明,就是指定接下来的字符都不必匹配,反前向声明使用“(?!匹配条件)”来表示

var s = "a:123 b=345";var r = /\w*(?!=)/;var a = s.match(r);//['a']

静态

图片描述

var s = "JavaScript, not Javascript";var r = /(Java)Script/gi;var a = r.exec(s);RegExp.input//"JavaScript, not Javascript"RegExp.leftContext//空字符串RegExp.rightContext//", not Javascript"RegExp.lastMatch//"JavaScript"RegExp.lastParen//"Java"

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

你可能感兴趣的文章
android课程表控件、悬浮窗、Todo应用、MVP框架、Kotlin完整项目源码
查看>>
go-micro 框架源码剖析 之 函数选项模式
查看>>
使用scrapy抓取Youtube播放列表信息
查看>>
python文件打包利器之pyinstaller的使用
查看>>
盒子边界(根据理解和测试记录,在概念上可能有描述错误,推荐补充)
查看>>
2019年到了,送你一份最新Java架构图谱(性能优化+微服务+……)
查看>>
react16生命周期方法
查看>>
Java™ 教程(Lambda表达式)
查看>>
wepy根据不同打包命令配置不同的全局变量
查看>>
leetcode 简化路径
查看>>
微信小程序开发系列教程三:微信小程序的调试方法
查看>>
29.22分钟学会书写正则
查看>>
moell/mojito - 基于 Laravel、Vue、ELement 构建的基础后台系统扩展
查看>>
Golang在使用range遍历map时的key随机化问题及解决方法
查看>>
Spring Boot(十四)RabbitMQ延迟队列
查看>>
Babel 插件原理的理解与深入
查看>>
数据类型二
查看>>
React-Native开发中的灵异组件-列表
查看>>
Pandas 学习笔记
查看>>
go语言中数组
查看>>