js正则表达式全局匹配正斜杠_指哪打哪的正则表达式

f5e8524149f58e152e4fd9715ff193a8.png

首先大家可以打开下面 的工具来进行正则的实操练习。

PHP, PCRE, Python, Golang and JavaScript​regex101.com

引言:正则本质上无非是匹配对的字符和匹配对的位置。

匹配字符

  1. 在javascript中,正则表达式可以以两种方式创建。
  var regex = new RegExp(regex,flag)
  var pattern = /regex/flag 

例如:

 var pattern = /s/g 
 var reg = new RegExp("s","g")

以上两种正则都可以匹配所有空白符,s在正则里表示空白符tvnrf
个人比较推荐第一种写法,因为第二种需要用反斜杠对反斜杠进行转译,比较容易造成歧义。

2. 直接匹配:直接输入需要匹配的字段,通过flag修饰符来控制筛选条件。flag是斜杠后面的修饰符,可以单个也多个一起出现。比如g代表global,表示全局匹配,i代表case-insensitive,表示忽略大小写。空格在正则中不会被忽略,请谨慎使用。

例1:忽略大小写

var pattern = /I like playing Warcraft/i

86751cb4f1dc5a4fe5f9c18b954dcbcf.png

这个正则忽略了大小写,所以不管是i like playing warcraft或者I LIke PlaYing WARcraft都会被匹配到。(是不是很简单粗暴呢)

例2:全局匹配

var pattern = /生活/

31367f0c98cdd06d26ae89cce06c37a5.png
var pattern =/生活/g

521053827885e31059788fa0fedd7198.png

3. 正则表达式中的字符组,对一个字符位进行匹配筛选。

在正则中,方括号[]之间的位置可以自动行使'或'的功能。

例如:/[江河湖海]南/g可以匹配字符串中出现的江南、河南、湖南、海南,但无法匹配越南。

ae362f4b495c850d147c65835f699f3d.png
  • 字符组内可以使用脱字符^来求反

例如:[^cdm]ash

cash dash mash 都不会被匹配 hash可以被成功匹配

1bd5c75da221b5ed8310281973b7b129.png

注:脱字符在组中表示开头。

  • 字符组中可以用范围来表示适用字符的范围

例如:

[abcdefghijk]=>[a-k]

[0123456789]=>[0-9]

[0123456789abcdef]=>[0-9a-f]

  • 常用的简写

虽然可以用-表示范围,但工程师的懒惰是止不住的,所以还有更进一步的常用简写。

a. d表示匹配数字,等同于[0-9]

b. D 表示匹配数字之外的任何字符,等同于[^0-9],也就是d取反。

c. w 表示匹配所有字母,数字和下划线,等同于[a-zA-Z0-9_]

d. W 表示匹配非单词字符,等同于[^a-zA-Z0-9_],也就是w取反。

e. s 表示空白符,等同于[tvnrf]

f. S 同理,S表示s的取反

g. . 点字符可以代表任何单个字符。

4. 正则表达式中的量词,表示对一个规则在数量上的延伸。

例如:/d{3}/ 匹配连续的3位数字 。

例如:/d{3,5}/ 匹配连续3到5位的数字。

例如:/d{3,}/ 匹配3位以上的连续数字。

例如:/d+/匹配3位以上的连续数字 +等同于{1,}

*表示0个及以上,等同于{0,}

?表示该规则可以存在0次或者1次,等同于{0,1}

bcb4cdd9cd64f90e7d5740dc1bfefcfc.png

7aca41a924e1f65c1153c516fdc30c0e.png

5. 正则表达式中的组:由括号()包裹的区域表示一个组,组表示一个独立的规则区域。

例如:(abc|cde){2,3} 表示匹配abc或者cde重复两到三遍的字符串。

9115fc26394a2eaecb97c64848bb864b.png

组是一个独立的匹配单元。比如匹配小时,分钟的时候就可以对规则进行拆分,从而提取到颗粒度更高的数据。

59fee1918771921f986934ee52be03ef.png

思考题

练习1:

匹配16位进制颜色码,颜色码以#号开头,由3位或616进制的字符组成,每个字符范围0-9合并a-f

测试用例: #000 #abc #0023AB #0Ab #FFFFFD

答案:#([0-9a-f]{3}){1,2}

练习2:匹配时间24小时制。

测试用例:23:59 03:02 07:00 12:00

答案:([0-1]d|2[0-3]):([0-5]d)

匹配位置

  1. 正则表达式的锚点

除了匹配字符,正则表达式也具有匹配位置(锚点)的功能。

简而言之:位置就是见缝插针。

6a62da7bd0c4533096cb8e6f9666a5b3.png
  • ^脱字符匹配开头
str.replace(/^/,'开头') //开头str

f02c846e68131071bb888fc42f997524.png
  • $匹配结尾
str.replace(/$/,'结尾') //str结尾

5aacc7ce2a8d42974aaea4ab503ea70b.png

dcdd5c2efbe0437c5e3833ff761f4da9.png
  • b匹配 wW之间,w^之间,w$之间的空隙 (这个规则和下面的规则看一下就好)
  • B匹配与b意思相反取得是WW之间、ww之间、W^之间,W$之间的空隙。

2. 先行断言 (positive lookahead)

先行断言表示判断某位置之前是不是合规,通俗的讲就是判断张三前面是不是坐着李四,人民币符号前面是不是跟着数字。它基本的表示方法就是(?=规则)

f273b188d8cf8dad64a8806caf27ed36.png

reg)(?=¥)匹配之前符合要求的字段,请看下面的例子

我是 :/d+(?=¥)/ 表示匹配前面的的数字

72957f3c0cee6a29aa5861a7325c61b6.png

同样,先行断言也可以取反,格式就是(?!规则)。比如,(?!¥)表示符合规则的字符串不可以出现在之前。

af0d5eb07dcfa8a4ed34319feba273f2.png

3. 后行断言 (positive lookbehind)

与前行断言类似,后行断言表示判断某位置之后是不是合规。需要注意的是,后行断言是ES6的新特性,要考虑兼容。在Taro2.0.4小程序的开发中会报错(Taro团队,假如你们看到话,请修复一下)。

比如,(?<=$)(reg)可以匹配$之后的数字,因为$本身在正则中表示结尾,所以用了反斜杠转译。

02117515df2d73adb9f111dae0eeeea1.png

后行断言也可以取反,将=替换成!即可。例如,(?<!$)(reg)表示匹配不在$后面的规则。

c203c063f98113ba74672ffbaa1cb2f7.png

参考文章:

JS正则表达式完整教程(略长) - 掘金​juejin.im
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值