正则表达式

351 阅读1分钟

书写正则的网站:regex101: build, test, and debug regex

1、只匹配当指定的字符串

语法:
    /^匹配规则$/
解释:
    /^固定开头,$固定结尾/
例子:
    /^123$/  //123

2、只匹配单个字符

语法:
    /^[匹配规则]$/
例子:
    /^[abc]$/  //可匹配单个的a\b\c
    /^[a-z]$/ //匹配a-z的任意字符
    /^[a-zA-Z]$/ //匹配a-z的任意大小写字符
    /^[^a-zA-Z]$/ //匹配不是a-z的任意大小写字符
    /^[0-9]$/  //匹配任意数字

3、匹配字符串

语法:
    /^[匹配规则]{数字}$/
例子:
    /^[a-zA-Z]{3}$/  //匹配a-z的任意大小写字符,三个组成的字符串
    /^[a-zA-Z]{3,6}$/  //匹配a-z的任意大小写字符,三个到六个的字符串
    /^[a-zA-Z]{3,}$/  //匹配a-z的任意大小写字符,三个到无穷个的字符串
注意:匹配特殊字符时需要加\
例子:/^\(\)$/ //匹配的是()

4、匹配任意字符(不匹配回车符)

语法:
    /^.{数字}$/
例子:
    /^.{3,6}$/ //匹配任意三个到六个字符(不匹配回车符)
    /^.{3,}$/ //匹配任意三个到无穷个字符(不匹配回车符)

5、一些匹配简写、匹配任意字符(包括回车)

    /\d/ //匹配任意数字
    /\D/ //\d的取反
    /\w/ //匹配a-z任意大小写字符和数字字符
    /\W/ //\w的取反
    /\s/ //匹配特殊字符(回车,tab符号,翻页符,空格符)
    /\S/ //\s的取反
    /\w{0,1}/ <=> /\w?   //?表示0次到1次
    /\w{0,}/  <=> /\w*   //*表示0次到无穷次
    /\w{1,}/  <=> /\w+   //*表示1次到无穷次

6、小练习

tang91@136.com  =>  /^[a-zA-z0-9]\w*@126\.com$/
第一个字符匹配的是字母和数字
因为.表示是除回车外的所有字符,所以需要转义,.前面加上\

7、正则表达式的进阶

A、组

语法:
    /^(?<变量名>)规则$/
例子:
    'sunwu51@126.com'.match(/^(?<first>[a-zA-z0-9]\w*)@126\.com$/)  //可以得到一个数组,数组中groups对象中多了一对键值对:key为first,value为(括号内的值)->sunwu51

B、组的复用

语法:
    (组的内容)\1
例子:
    '1212'.match(/^(\d\d)\1$/) //通过()把两个/d分成一组,\1则表示这个组
语法:
     (?<自定义组名>)\k<first>
例子:
    '1212'.match(/^(?<first>\d\d)\k<first>$/)  ////可以得到一个数组,数组中groups对象中多了一对键值对:key为first,value为(括号内的值) -> 12

C、分组从左往右看

语法:(?=) 和 (?!)
例子:
    'foobar,fooboo'.match(/foo(?=bar)/) //取的是foobar的foo
    'foobar,fooboo'.match(/foo(?!bar)/) //取的是fooboo的foo

D、分组从右往左看

语法:(?<=) 和 (?<!)
例子:
    'barfoo,boofoo'.match(/(?<=bar)foo/) //取的是barfoo的foo
    'barfoo,boofoo'.match(/(?<!bar)foo/) //取的是boofoo的foo

E、正则匹配一个四字成语 - 滔滔不绝

由上可看出,涛涛不绝是属于aabc型的成语
第一位分组为a,第二位复用a,第三位限制不能为a,且将第三位进行分组b,第四位限制,不能为b或者a
最终答案:
'aadc'.match(/^(?<a>.)\k<a>(?!\k<a>)(?<b>.)(?!\k<b>|\k<a>).$/)