RegExp

  1. 匹配字符
    1. 横向(长度)
    2. 纵向(类型)
      1. 不是[^ ]
  2. 匹配位置
    1. 模式头
    2. 非模式头
    3. 模式尾巴
    4. 非模式尾
    5. 单词
    6. 非单词

JavaScript RegExp 对象有3个方法:test()、exec()、compile()

  • test():检测一个字符串是否匹配某个正则表达式,如果匹配成功,返回true,否则返回false;
  • var r = /\d{3}/;
    var a = '123';
    
    r.test(a)  //true
    
  • exec():检索字符串中与正则表达式匹配的值,返回一个数组,存放匹配的结果;如果未找到,返回null;
  • var str = "Here is a Phone Number 111-2313 and 133-2311" ;
    var reg = /(\d{3})[-.]\d{4}/g;
    var result = reg.exec(str);
    

str的方法

  • replace
  • var s = "Hello,My name is Vincent."
    
    var result = s.replace(/([aeiou])/g,"$1$1")
    //"Heelloo,My naamee iis Viinceent."

  • match(reg):返回可以匹配序列(类似exec)
  • var reg = /w+/
    var s = "compus, I know something about you"
    
    s.match(reg) //["compus"]
    
  • split(reg):分开为数组
  • var s = "unicorns and rainbows And, Cupcakes"
    
    result = s.split(/[,\s]/);
    //["unicorns", "and", "rainbows", "And", "", "Cupcakes"]

正则表达式是匹配模式,要么匹配字符要么匹配位置.各种方式结合,取交集

匹配区间正则表达式记忆方式
除了换行符之外的任何字符.句号,除了句子结束符
单个数字, [0-9]\ddigit
除了[0-9]\Dnot digit
包括下划线在内的单个字符,[A-Za-z0-9_]\wword
非单字字符\Wnot word
匹配空白字符,包括空格、制表符、换页符和换行符\sspace
匹配非空白字符\Snot space
多行模式m标志multiple of lines
忽略大小写i标志ignore case, case-insensitive
全局模式g标志global

多行模式可以匹配多个^$

1、匹配位置

^

脱字符,匹配行的开头


let string = 'hello'

console.log(string.replace(/^/, '😄')) // 😄hello


$

美元符号,匹配行的结尾


let string = 'hello'

console.log(string.replace(/$/, '😄')) // hello😄


\b

单词的边界,具体讲有三点规则。

① \w和\W之间的位置

② ^与\w之间的位置

③ \w与$之间的位置


'xxx_love_study_1.mp4'.replace(/\b/g, '❤️') // ❤️xxx_love_study_1❤️.❤️mp4❤️

\B

非单词的边界,也就是\b反着来的意思,它的规则如下:

① \w与\w之间的位置

② \W与\W之间的位置

③^与\W之间的位置

④\W与$之间的位置

'[[xxx_love_study_1.mp4]]'.replace(/\B/g, '❤️')//
❤️[❤️[x❤️x❤️x❤️_❤️l❤️o❤️v❤️e❤️_❤️s❤️t❤️u❤️d❤️y❤️_❤️1.m❤️p❤️4]❤️]❤️

(?=p)

符合p子模式前面的那个位置。换句话说是,有一个位置,紧跟其后需要满足p子模式。也有一个学名叫正向先行断言。

'xxx_love_study_1.mp4'.replace(/(?=xxx)/g, '❤️') // ❤️xxx_love_study_1.mp4

(?<=p)

符合p子模式后面(注意(?=p)表示的是前面)的那个位置。换句话说是,有一个位置,其前面的部分需要满足p子模式。

'xxx_love_study_1.mp4'.replace(/(?<=xxx)/g, '❤️') //xxx❤️_love_study_1.mp4


(?!p)

(?=p)反过来的意思,可以理解为(?=p)匹配到的位置之外的位置都是属于(?!p)的,它也有一个学名叫负向先行断言。


'xxx_love_study_1.mp4'.replace(/(?!xxx)/g, '❤️') 

// (?=xxx)的输出
❤️xxx_love_study_1.mp4
// (?!xxx)的输出
x❤️x❤️x❤️_❤️l❤️o❤️v❤️e❤️_❤️s❤️t❤️u❤️d❤️y❤️_❤️1❤️.❤️m❤️p❤️4❤️

(?<!p)

(?<=p)反过来的意思,可以理解为(?<=p)匹配到的位置之外的位置都是属于(?<!p)的,


'xxx_love_study_1.mp4'.replace(/(?<!xxx)/g, '❤️') 

// (?<=xxx)的输出
xxx❤️_love_study_1.mp4
// (?<!xxx)的输出
❤️x❤️x❤️x_❤️l❤️o❤️v❤️e❤️_❤️s❤️t❤️u❤️d❤️y❤️_❤️1❤️.❤️m❤️p❤️4❤️

2、匹配字符

两种模糊匹配

横向

一个正则可匹配的字符串的长度不是固定的,可以是多种情况,通过量词+、*、?、{m,n},可实现横向匹配

*:匹配任意次

+:最低匹配1次

?:匹配1次或者0次

{m}:匹配m次

{m,}:最低匹配m次

{m,n}:最低匹配m次,最多匹配n次,m需要小于等于n

纵向(是或不是)

一个正则匹配的字符串,具体到某一位字符时,可以不是某个确定的字符串,可以有多种可能,实现方式是字符组( 其实多选分支|也可以实现 )

字符组

范围表示法

[123456abcdefABCDEF] => [1-6a-fA-F]
复制代码

排除字符组

某位字符可以是任何东西,但是就是不能是xxx, 使用^符号

问题:如何要表示除了某个单词之外的任意东西呢?(在中括号中)

[^abc]
复制代码

常见简写形式

\d // 数字
\D // 非数字
\w // [0-9a-zA-Z_]
\W // [^0-9a-zA-Z_]
\s // [\t\v\n\r\f]
\S // [^\t\v\n\r\f]
.
复制代码

量词

量词 & 简写

1. {m,} // 至少出现m次
2. {m} // 出现m次
3. ? // 出现0次或者1次,等价于{0,1}    
4. + // 至少出现1次,等价于{1,} 
5. * // 出现人一次,等价于{0,}  

贪婪匹配 VS 惰性匹配

正则本身是贪婪的,会尽可能的多匹配符合模式的字符

量词后面加一个?,即变成了惰性匹配

let regex = /\d{2,5}/g
let string = '123 1234 12345 123456'
// 贪婪匹配
// string.match(regex) // [ 123, 1234, 12345, 12345 ]

// 惰性匹配
let regex2 = /\d{2,5}?/g
// string.match(regex) // [ 12, 12, 34, 12, 34, 12, 34, 56  ]

多选分支

一个模式可以实现横向和纵向的模糊匹配,而多选分支可以支持多个子模式任选其一,形式是(p1|p2|p3)


常用表达

.+
任意字符出现
?=.*\d任意字数符号之后是数字

一般要加开头结尾^&

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值