首页 > 其他分享 >关于正则表达式 g,m 参数的总结,为了回答“正则表达式(/[^0-9]/g,'')中的"/g"是什么意思?”

关于正则表达式 g,m 参数的总结,为了回答“正则表达式(/[^0-9]/g,'')中的"/g"是什么意思?”

时间:2023-09-19 15:06:25浏览次数:36  
标签:总结 匹配 regx rs 正则表达式 加入 参数 str var


为了解答“正则表达式(/[^0-9]/g,'')中的"/g"是什么意思?”这个问题,也为了能够便于大家对正则表达式有一个更为综合和深刻的认识,我将一些关键点和容易犯糊涂的地方再系统总结一下。 

总结1:附件参数g的用法 

表达式加上参数g之后,表明可以进行全局匹配,注意这里“可以”的含义。我们详细叙述: 

1)对于表达式对象的exec方法,不加入g,则只返回第一个匹配,无论执行多少次均是如此,如果加入g,则第一次执行也返回第一个匹配,再执行返回第二个匹配,依次类推。例如 
var regx=/user\d/; 
var str="user18dsdfuser2dsfsd"; 
var rs=regx.exec(str);//此时rs的值为{user1} 
var rs2=regx.exec(str);//此时rs的值依然为{user1} 
如果regx=/user\d/g;则rs的值为{user1},rs2的值为{user2} 
通过这个例子说明:对于exec方法,表达式加入了g,并不是说执行exec方法就可以返回所有的匹配,而是说加入了g之后,我可以通过某种方式得到所有的匹配,这里的“方式”对于exec而言,就是依次执行这个方法即可。 

2)对于表达式对象的test方法,加入g于不加上g没有什么区别。 

3)对于String对象的match方法,不加入g,也只是返回第一个匹配,一直执行match方法也总是返回第一个匹配,加入g,则一次返回所有的匹配(注意这与表达式对象的exec方法不同,对于exec而言,表达式即使加上了g,也不会一次返回所有的匹配)。例如: 
var regx=/user\d/; 
var str="user1sdfsffuser2dfsdf”; 
var rs=str.match(regx);//此时rs的值为{user1} 
var rs2=str.match(regx);//此时rs的值依然为{user1} 
如果regx=/user\d/g,则rs的值为{user1,user2},rs2的值也为{user1,user2} 

4)对于String对象的replace方法,表达式不加入g,则只替换第一个匹配,如果加入g,则替换所有匹配。(开头的三道测试题能很好的说明这一点) 

5)对于String对象的split方法,加上g与不加g是一样的,即: 
var sep=/user\d/; 
var array="user1dfsfuser2dfsf".split(sep); 
则array的值为{dfsf, dfsf} 
此时sep=/user\d/g,返回值是一样的。 

6)对于String对象的search方法,加不加g也是一样的。 

总结2:附加参数m的用法 

附加参数m,表明可以进行多行匹配,但是这个只有当使用^和$模式时才会起作用,在其他的模式中,加不加入m都可以进行多行匹配(其实说多行的字符串也是一个普通字符串),我们举例说明这一点 

1)使用^的例子 
var regx=/^b./g; 
var str="bd76 dfsdf sdfsdfs dffs\n b76dsf sdfsdf"; 
var rs=str.match(regx); 
此时加入g和不加入g,都只返回第一个匹配{bd},如果regx=/^b./gm,则返回所有的匹配{bd,b7},注意如果regx=/^b./m,则也只返回第一个匹配。所以,加入m表明可以进行多行匹配,加入g表明可以进行全局匹配,综合到一起就是可以进行多行全局匹配 

2)使用其他模式的例子,例如 
var regx=/user\d/; 
var str="sdfsfsdfsdf sdfsuser3 dffs \nb76dsf user6"
var rs=str.match(regx); 
此时不加参数g,则返回{user3},加入参数g返回{user3,user6},加不加入m对此没有影响。 

3)因此对于m我们要清楚它的使用,记住它只对^和$模式起作用,在这两种模式中,m的作用为:如果不加入m,则只能在第一行进行匹配,如果加入m则可以在所有的行进行匹配。我们再看一个^的例子 
var regx=/^b./; 
var str="ret76 dfsdf \nbjfsdfs dffs\n b76dsf sdfsdf"; 
var rs=str.match(regx); 
此时rs的值为null,如果加入g,rs的值仍然为null,如果加入m,则rs的值为{bj}(也就是说,在第一行没有找到匹配,因为有参数m,所以可以继续去下面的行去找是否有匹配),如果m和g都加上,则返回{bj,b7}(只加m不加g说明,可以去多行进行匹配,但是找到一个匹配后就返回,加入g表明将多行中所有的匹配返回,当然对于match方法是如此,对于exec呢,则需要执行多次才能依次返回) 

总结3:在HTML的textarea输入域中,按一个Enter键,对应的控制字符为“\r\n”,即“回车换行”,而不是“\n\r”,即“换行回车”,我们看一个前面我们举过的例子: 
var regx=/a\r\nbc/; 
var str=“a\nbc”; 
var rs=regx.exec(str); 
结果:匹配成功,rs的值为:{ },如果表达式为/a\n\rbc/,则不会被匹配,因此在一般的编辑器中一个”Enter”键代表着“回车换行”,而非“换行回车”,至少在textarea域中是这样的。

标签:总结,匹配,regx,rs,正则表达式,加入,参数,str,var
From: https://blog.51cto.com/u_1481758/7525082

相关文章

  • 【原创】局域网某视频总结《二》
        大家好,我是你们的龙少一郎,还是那个不变的我。自从看过某师视频以来,就对它迷恋如相好,膜拜如山倒。现在我就对看过的内容写出系列体会之如下:《网络基础之二层介绍》       我首先说明的是我对写的内容是对看到的自我体会写下来的,没有前后顺序之分,也没有十分严谨......
  • 【原创】局域网某视频总结《一》
        大家好,我是你们的龙少一郎,还是那个不变的我。自从看过某师视频以来,就对它迷恋如相好,膜拜如山倒。现在我就对看过的内容写出系列体会之如下:《网络基础之二层介绍》       我首先说明的是我对写的内容是对看到的自我体会写下来的,没有前后顺序之分,也没有十分严谨......
  • 【RocketMQ】消息的消费总结
    消费者从Broker拉取到消息之后,会将消息提交到线程池中进行消费,RocketMQ消息消费是批量进行的,如果一批消息的个数小于预先设置的批量消费大小,直接构建消费请求ConsumeRequest将消费请求提交到线程池处理,否则需要分批构建进行提交。消息消费在消息被提交到线程池后进行处理时,会调......
  • 嵌入式三级知识点总结最终章
    181. 操作系统为软件系统提供了多任务运行环境等等而不是板级支持包,BSP运行之前,调试工具不能够用,BSP调试分两步 最小系统和外围设备驱动程序调试。182. RAM访问速度要比ROM快很多。183. U-Boot能够支持多种体系结构的处理器但是每种结构有其自身的版本。184. VXworks(微内核)......
  • 全网最详细的OSPF原理总结,看这篇就够了!
    大家好,我的网工朋友。OSPF是一种基于链路状态的路由协议,也是专为IP开发的路由协议,直接运行在IP层上面。它从设计上保证了无路由环路。除此之外,IS-IS也是很常见的链路状态协议。为什么会出现OSPF?作为目前主流的IGP协议,OSPF主要是为了解决RIP的三大问题而出现的,比如:收敛很慢、容......
  • Glide源码阅读之工厂模式4总结
    工厂模式的应用比较多;变化形态也是各种各样。但经过这段时间的解读。大概可以用浓缩为1、不是使用new创建对象;2、没有明显build方法创建对象;3、带xxxFactory的几乎都满足工厂模式。当然第3点比较明显。如果不带xxxFactory等这样的标识那看看是否有implements、extends。而且内......
  • angular event服务,不同组件间参数传递
    利用AngularEvent在不同组件之间传递数据为了实现在Angular不同Component之间相互传递数据,可以使用Event分发的思路来实现。使用事件实现在不同组件之前传递数据的思路如下:定义一个服务,用来实现事件的发布和订阅方法。组件A注入事件服务的依赖,将自己要传递数据的数据以事件的形式......
  • 【Android studio】【Gradle】dependencies配置参数细解及异常解决
    依赖项配置implementationGradle会将依赖项添加到编译类路径,并将依赖项打包到构建输出。不过,当您的模块配置implementation依赖项时,会让Gradle了解您不希望该模块在编译时将该依赖项泄露给其他模块。也就是说,其他模块只有在运行时才能使用该依赖项。使用此依赖项配置代替api......
  • Glide源码阅读之策略模式4总结
    《Android源码设计模式解析与实践》定义策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化使用场景针对同一类型问题的多种处理方式。仅仅是具体行为有差别时需要安全地封装多种同一类型的操作时出现同一抽......
  • 迭代器、生成器、模块和包知识点总结
    第一部分:迭代器 例1. for....in运行机制li=[1,2,3,4]#在列表中取值从第一个取到最后一个结束#foriinli:#print(i)#1,2,3,4i=0whilei<len(li):#索引#print(i)#输出索引0,1,2,3print(li[i])#取列表值i+=1print(i)#i=4的时......