拓展-5【一篇文章搞懂正则】

一.基本形式

ihateregex.io正则查询网站

(1).声明方式

var exp = /at/gim

var p2 = new RegExp('at','gim') 不建议使用这种方式

var p1 = /\.at/
var p2 = new TegExp('\\.at')因为在字符串中需要转译

(2).空格无法匹配

console.log(/ab /.test('ab'));

false

二.元字符

.任意字符

?贪婪匹配

()子表达式

[]字符组

[^]非字符组

*0此或多次

+一次或多次

{min,max}范围

^开头

$结尾

(1).\转义符

log(/1+1/.test('1+1')); //false
log(/1\+1/.test('1+1'));//true

特殊

log(/]/gim.test(']'))//false
log(/\]/gim.test(']'))//true

没有特殊语义

就算加了转译字符也不影响,所以在拿不准的时候可以尝试加入

\t \r\n这些是特殊语义的字符,是非打印字符要注意\

双重转译

log(/\\a/gim.test('a'));//false
log(/\\a/gim.test('\a'));//false
log(/\\a/gim.test('\\a'));//true

(2).[]范围

只匹配字符中的一位

log(/[0-9]/)
log(/[5678901234]/)两者等价,但是第二种是无序的,但是第一种是有序的
log(/[9-0]/.test(1))//这样会报错

-连接符

都为true也就是说是-为一段,而这三段之间互不影响

log(/[0-9A-Za-z]/.test('1'))
log(/[0-9A-Za-z]/.test('A'))
log(/[0-9A-Za-z]/.test('a'))
log(/[0-9a-zA-Z]/.test('a'))
log(/[0-9a-zA-Z]/.test('A'))
log(/[0-9a-zA-Z]/.test('1'))

也都为true  解析是1-3 4-6 7-9

log(/[1-34-67-9]/.test('5'))
log(/[1-34-67-9]/.test('1'))
log(/[1-34-67-9]/.test('7'))
log(/[1-34-67-9]/.test('8'))
log(/[1-34-67-9]/.test('3'))

特殊

log(/[-]/.test('-'))//true

(3).[^]范围取反

必需保证第一位,否则当普通字符处理

log(/[^a-z]/.test('A'))//TRUE

单独一个也算范围

LOG(/[^a]/.test('b'))//true

(4).范围的简写

\d [0-9]

\D [^0-9]

\s [\f\n\r\t] space

\S[^\f\n\r\t]]

\w[0-9A-Z-a-z_]注意有一个_

\W[^0-9A-Z-a-z_]

.任意字符

是没办法代表\r\n

任意字符的匹配方式

[\d||\D][\s||\S][\w||\W]

(5).次数

{min,max}

这样写很麻烦

log(/[0-9][0-9][0-9]/);
log(/\d\d\d/)

代表匹配量

log(/\d{6}/)

exec告诉你匹配了那些字符而不是t只是返回true

log(/\d{6}/.exec(123456789));

至少匹配

不确定最大数的话就空着,但是不要加空格

log(/\d{6,}/.exec(123456789));

量词只修饰一个字符,如果要全部修饰就加()包裹住

(6).次数为一次或0次的缩写

? = {0,1} = 只要有一个

* = {0,} = 任意个数

+ = {1,} = 最少一个

(7).非贪婪模式

贪婪模式非贪婪,前提是需要有量词的

正则都是贪婪的

量词后面加问号转为非贪婪

log(/a+?/.exec('aaaaa')) //只能匹配到一个a

范围都会有非贪婪

?? = {0,1} = 0

*? = {0,} = 0

+? {1,} = 1

.test是会返回true的,因为都匹配上了,匹配几位不重要

贪婪应用

log(/<script>[\s\S]*?<\/script>/.exec('<script>var a =1<\/script>'))

当量词是固定的时候没有必要加非贪婪模式,但是加上也不会报错

量词的前面一定会有元素

8.()子表达式

子表达式用于匹配

起到一个引用的作用

加了括号才可以让量词修饰前面的整体字符

log(/\w\d{3,6}/.exec('a123')) //a123
log(/(\w\d){3,6}/.exec('a1b2c3'))//a1b2c3

例如平常的模板替换就是如此

()里面的就叫做子表达式时可以单另匹配出来的

例如要匹配出2020-03-24的三个日子就要用括号包裹

log(/(\d{4})-(\d{1,2})-(\d{1,2})/exec('2020-7-17'))//
0:2020-7-17
1:2020
2:7
3:17

特殊调用方式

log(RegExp.$1);//2020
log(RegExp.$2);//7
log(RegExp.$3);//17
//没有$0

响应最近的一个正则

(9).非捕获

让exec出来的结果忽略它

let arr1=/(\d\d){1,2}-(\d\d){1,2}-(\d{4})/.exec('1988-1999-2020')
log(arr1[1])//88
log(arr1[2])//99
log(arr1[3])//2020

let arr1 =/(?:\d\d){1,2}-(?:d\d){1,2}-(\d{4})/.exec('1988-1999-2020')
log(arr1[1])//2020
log(arr1[2])//un
log(arr1[3])//un

两个\d

log(/(\d\d){1,2}/.exec('2014')) //0 :2014 1:14
log(/(\d\d){1,2}?/.exec('2014'))//0: 20 1:20

(10).反向引用

后一个表达式必需与上一个相等

log(/\w\w/.exec('ab'))//ab
log(/(\w)\1/.exec('aa'))//0:aa 1:a

实例

log(/<([^<>]+)>.*?<\/\1>/.exec('<ab>13sdf</ab>'))//
0:<ab>13sdf</ab>
1:ab

|

有点像或的语法

0-255其中的一个

匹配id

 分组匹配日期

范围中不要出现重叠,虽然会匹配上,但是影响了效率

断言

\b单词边界

\B


以什么开头,以什么结尾

用来替换空格



正向预查

环视满足条件的字符


匹配到的是""

正则优先级

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值