匹配字符规则:

  . 通配符,匹配除换行符外的所有字符

  \d 匹配数字,同[0-9]

  \D 非数字

  [a-z] 匹配小写字母

  [A-Z] 匹配大写字母

  \s 匹配任意空白字符

  \S 匹配任意非空白字符,和\s相反

  \w 匹配任意字类字符和_,同[a-zA-Z0-9_]

  \W \w相反

  \b 单词开始和结束位置

  [] 多选匹配,可匹配[]中所有字符

 

  [^] 不匹配[]中所有字符(如/^[^1]$/.test(1) == false)
  | 或选项,可匹配|之前或之后的部分,配合()限制作用域

  ^ 匹配字符串开头位置

  $ 匹配字符串结束位置,和^一起使用表示精确匹配

匹配数量规则:

 

  * 匹配任意数量字符

  + 匹配1到多个字符

  ? 匹配01个字符

  {x,y} 匹配x-y个字符,y不存在时无上限

  {x} 匹配x个字符

创建方法:

  字面量:包含在//之间,如/\d*/

  通过new生成:new RegExp(‘\d*’);new RegExp(/\d*/) 返回结果也是/\d*/

匹配模式规则:

  g: 匹配所有字符

  i: 不区分大小写匹配

  u: 识别unicode字符(es6)

  y: 每次匹配会修改lastIndex,导致下次匹配从上次匹配结束位置开始(es6)

贪婪匹配:

  默认状态就是贪婪匹配,总是匹配尽可能多的字符

  而非贪婪匹配,在之后加一个?,匹配尽可能少的字符

 

/\w+/.exec('123ad');    //['123ad']
/\w+?/.exec('123ad');    //['1']

 

正则子作用域:

  使用()可以在正则表达式中添加子作用域,可以修改正则元算符和匹配符的作用范围;

  例:/(az)+/匹配azazaz...而不是azzzzzz

  /a(abc|123)/匹配aabca123而不是aabc123

  保存变量:

  例:/(abc)d/.test(’abcd’)会把abc保存到RegExp.$1

  常用替换字符串特定字符:

 

'1234'.replace(/\d/g, '$1s');    //1s2s3s4s

  ps:$1代表第一个匹配到的参数,$2代表第二个。。。依次类推

正则预查:

  正则中我们可以使用预查来筛选特性的字符,不过比较可惜的是js只支持向后预查

  (?=str)匹配后面跟着str字符串的部分

  (?!str)匹配后面没有str字符串的部分

'1_2$34a'.replace(/\d(?=[a-z])/g, 'h');    //"1_2$3ha"
'1_2$34a'.replace(/\d(?![a-z])/g, 'h');    //"h_h$h4a"

Ps:在进行匹配时,不会吧预查部分内容匹配出来,我们使用replace的时候也不会对预查部分进行替换

正则方法:

  exec:用正则表达式模式在字符串中查找,并返回该查找结果的第一个值(数组),如果匹配失败,返回null 

  test:返回一个bool值,判断是否满足匹配条件

 

/\d/.exec('123456');    //['1']
/\d/.test('123456');    //true

 

字符串方法:

  split :按照参数提供规则切割字符串,返回相应数组,第二个参数可指定数组最大长度

  match:和exec匹配一样,不过匹配所有的值返回
  
search:返回匹配值的位置

  replace:

    替换匹配到的字符串,第二个参数字符串时:

      $$插入一个$

      $&插入匹配的子串

      $`插入匹配子串左侧内容

      $’插入匹配子串右侧内容

      $n插入匹配到的第n个子串

    如果第二个参数是function:

      第一个参数是匹配字符

      2-n:相当于$n

      倒数第二个参数:偏移量

      最后一个参数:源字符串

 

'123456'.match(/\d/g);    //["1", "2", "3", "4", "5", "6"]
'a123456'.search(/\d/);    //1
'192.168.1.1'.replace(/\d+/g, 'a');    //"a.a.a.a"
'192.168.1.1'.replace(/(\d+)/g, '$1a');    //"192a.168a.1a.1a"
'192.168.1.1'.replace(/(\d+)/g, (arg) => arg + 'a');    //"192a.168a.1a.1a"
'192.168.1.1'.replace(/(\d+)/g, (arg, arg1) => arg1 + 'a');    
//"192a.168a.1a.1a"
'1 2 3 4'.split(' ');    //["1", "2", "3", "4"]
'1 2 3 4'.split(' ', 2);    //["1", "2"]
'1 2 3 4'.split(' ', 10);    //["1", "2", "3", "4"]

 

最后,写一个关于ipv4地址的正则匹配规则:

0-255.0-255.0-255.0-255

每个数字都是0-255

正则表达式:/(25[0-5]|2[1-4]\d|1\d{2}|[1-9]\d|\d)/

25[0-5]匹配250-255之间数字

2[14]\d匹配200-249之间数字

1\d{2}匹配100-199之间数字

[1-9]\d匹配10-99之间数字

\d匹配0-9之间数字

然后我们重复组装:

/^((25[0-5]|2[1-4]\d|1\d{2}|[1-9]\d|\d)\.){3}(25[0-5]|2[1-4]\d|1\d{2}|[1-9]\d|\d)$/

至此就算匹配成功