正则表达式第三回--模式、分组与前瞻

贪婪的正则

正则是默认贪婪的,它会尽可能多的匹配,我想这是一个大家都知道的事实。 经典例子:

‘12345678‘.replace(/\d{3,7}/g, ‘#‘)

// 输出: #8

可以看到,规则是匹配3~7个数字,由于正则默认是贪婪模式,匹配了最大数量7个;

如果我们希望它尽可能少的匹配,也就是说一旦匹配成功就不继续匹配了,只需要在量词后面加个问号即可。

‘12345678‘.replace(/\d{3,7}?/g, ‘#‘)

// 输出: ##78

分组

我们知道,量词是作用于紧挨着它的那个元字符或原义文本字符或分组的

‘a1b2c3d4‘.replace(/[a-z]\d{3}/g, "#")

// 输出: a1b2c3d4

上面这个示例中,我们本来试图匹配一个小写英文字母加数字连续出现3次的场景,把它换成#,但是事与愿违,规则与字符串并没有匹配上。实际上,紧挨着量词{3}的是一个元字符\d,所以这里的意思是:匹配数字连续出现三次。

如果要准确匹配我们的初始想法,可以给这个组合加上分组,修改后如下:

‘a1b2c3d4‘.replace(/([a-z]\d){3}/g, "#")

// 输出: #d4

当然,分组的魅力不在这里,分组的最大魅力在于分组引用,在repalce函数的第二个参数中,可以直接在字符串

神奇的"或"

或的写法是|,正则的或是单竖杠,JS中逻辑符号的或是双竖杠,这点需要注意。

或符号|在没有碰到分组边界的时候会把正则表达式“切割”成好几段,在遇到分组边界时则停止,比如/Lady|Gaga/表示匹配单词LadyGaga

"LadyGaga".replace(/Lady|Gaga/g, ‘#‘);// 输出: ##

注意:或字符两边不要留空格,写成/Lady | Gaga/这样,因为这里的空格也属于原义文本字符。

当然,一开始我们也提到了,在遇到分组边界符时,或字符就“割”不动了,会停下来。这种情况比较少。

有前瞻,没有后顾

所谓前瞻,就是当匹配到符合正则的内容时,向前检查前面的内容是否符合断言部分。

断言这个概念是什么意思呢?它可以在里面书写一切的正则表达式,形式为(?=我们写的正则规则),但和普通的正则表达式不同的是:它不算作正式规则的一部分,只作为一种我们定义规则的辅助规则。举个栗子就明白了:

"my love, my heart".replace(/my\slove/g, ‘#‘);// 正常书写正则,输出为 #, my heart

"my love, my heart".replace(/my(?=\slove)/g, ‘#‘);// 用断言书写后面的空格加love,输出 # love, my heart// 断言内的空格加love并没有随my一起被替换掉

原来这特么就叫断言啊。

注意一下前瞻的方向,因为字符串的匹配是从左到右,所以向前,也就是向右。

原文地址:https://www.cnblogs.com/zhangnan35/p/12411266.html

时间: 2024-10-08 18:52:07

正则表达式第三回--模式、分组与前瞻的相关文章

正则表达式 第三篇:分组匹配

通常情况下,分组是用一对圆括号“()”括起来的正则表达式,匹配出的内容就表示一个分组.分组有一个例外的情况,分组也可以不使用圆括号,而是使用 | 元字符来表示分组,| 的两侧是两个分组. 当使用圆括号表示分组时,从正则表达式的左边开始看,看到的第一个左括号“(”表示第一个分组,第二个"("表示第二个分组,依次类推,需要注意的是,有一个隐含的全局分组(就是0),就是整个正则表达式.默认情况下,正则表达式为每个分组自动分配一个组号,规则是:组号从1开始,从左向右,组号依次加1(base+1

正则表达式的三种模式【贪婪、勉强、侵占】的分析

假定要分析的字符串是xfooxxxxxxfoo 模式.*foo (贪婪模式): 模式分为子模式p1(.*)和子模式p2(foo)两个部分. 其中p1中的量词匹配方式使用默认方式(贪婪型). 匹配开始时,吃入所有字符xfooxxxxxx去匹配子模式p1.匹配成功,但这样以来就没有了字符串去匹配子模式p2.本轮匹配失败:第二轮:减少p1部分的匹配量,吐出最后一个字符, 把字符串分割成xfooxxxxxxfo和o两个子字符串s1和s2. s1匹配p1, 但s2不匹配p2.本轮匹配失败:第三轮,再次减少

php正则表达式的三个最基本原则分享

我个人认为,正则表达式的常规用法可以分为如下三个最基本的原则:1.找谁.2.怎么找.3.找它干什么. 接下来,我分享一下一个正则表达式分三个部分: 原子字符 . 匹配除换行符以外的任意字符 \w 匹配一个字母或数字或下划线 \s 匹配一个空白符 \d 匹配一个数字 \b 匹配单词的开始或结束的位置(匹配一个位置) ^ 匹配字符串的开始 $ 匹配字符串的结束 表示范围 [] 匹配括号中的任意一个字符 量词 重复0次或更多次 重复1次或更多次 ? 重复0次或1次 {n} 重复n次 {n,} 重复n次

delegate,notifucation,KVO三种模式实现通信的优缺点

在开发ios应用的时候,我们会经常遇到一个常见的问题:在不过分耦合的前提下,controllers间怎么进行通信.在IOS应用不断的出现三种模式来实现这种通信: 1.委托delegation: 2.通知中心Notification Center: 3.键值观察key value observing,KVO 上面的三种模式是什么? 三种模式都是一个对象传递事件给另外一个对象,并且不要他们有耦合. 三种模式都是对象来通知某个事件发生了的方法,或者更准确的说,是允许其他的对象收到这种事件的方法.这对于

小米、华为与联想,背后隐含的三种模式(转)

1 月 15 号参加了小米产品发布会,正当雷军在台上讲小米 Note 的种种功能时我却突然意识到小米.华为.联想的拼杀到了 2015 年已经完全进入到了一个新的阶段.在功能和体验上诚然大家会激烈的彼此追赶但其实已经拉不开太多的距离,最终决定胜负的很可能是手机背后所体现出来的模式.这很像一场国战,胜负不再取决于一城一地而是取决于综合国力. 小米.华为与联想背后隐含的商业模式 虽然最终呈现给用户的手机是类似的,但就我看来这三家背后隐含的模式却是有本质不同. 联想是经典的经营管理派.这一派的基本逻辑是

正则表达式(三)

元字符 "{n}"."{n,}"."{n,m}" "{n}" 匹配确定的n次(n是一个非负整数). 例如:o{2}能匹配"zoo". "{n,}" 匹配至少n次(n是一个非负整数). 例如:o{1,}能匹配"zo"以及"zoo". "{n,m}" 匹配n至m次,n<=m,最少n次且最多m次,(n,m均为非负整数). 元字符

Linux中vim的三种模式以及基本命令

在Linux中vim的三种模式分别为:命令模式.末行模式.编辑模式.以下是三者的关系图: 三种模式的彼此切换: 命令模式是vim中的默认模式. 命令模式切换至末行模式: 使用英文冒号(:). 末行模式切换至命令模式: 按一下esc 或者 两下esc 或者 删除末行的全部命令. 命令模式切换至编辑模式: 按键 i 或者 a. 编辑模式切回命令模式: 按下esc. 其中,末行模式 和 编辑模式 之间,不能直接切换,必须切换到命令模式,再进行切换. 接下来细化到每个模式下的各种命令操作: 一.末行模式

httpd的三种模式比较

查看你的httpd使用了哪种模式: /usr/local/apache2/bin/httpd -V |grep 'Server MPM' 使用哪种模式,需要在编译的时候指定 --with-mpm=prefork|worker|event 当然也可以编译的时候,让三者都支持: --enable-mpms-shared=all 然后在配置文件中,修改 LoadModule mpm_worker_module modules/mpd_mpm_worker.so 2.2版本默认为worker,2.4版本

[转]VMware虚拟机上网络连接(network type)的三种模式--bridged、host-only、NAT

转自:http://www.cnblogs.com/xiaochaohuashengmi/archive/2011/03/15/1985084.html VMWare提供了三种工作模式,它们是bridged(桥接模式).NAT(网络地址转换模式)和host-only(主机模式).要想在网络管理和维护中合理应用它们,你就应该先了解一下这三种工作模式. 1.bridged(桥接模式) 在这种模式下,VMWare虚拟出来的操作系统就像是局域网中的一台独立的主机,它可以访问网内任何一台机器.在桥接模式下