正则表达式

Posted on Aug 25, 2019

精准匹配

一个字符跟着一个字符,完全匹配

/test/

匹配一类字符

匹配组合中的任意一个👇

[abc]

除了组合中的所有👇

[^abc]

☢️歧义:^有2中含义:在[]中表示“非”,在正则表达式的开头/^abc/,表示匹配以abc开头的字符串。

从a到m之间👇

[a-m]

转义

字母和数字都可以表示自己。但$``-``^可以表达自身以外的东西,要使用反斜杠“\”来转义。

重复

/t?est/👉字符后加?表示一次或零次出现

/t+est/👉+表示一次或多次出现

/t*est/👉 *表示零次或多次出现

/t{4}est/👉{4}表示4次出现

/t{4,10}est/👉{4-10}表示4-10次出现

/t{4,}est/👉{4,}表示4-多次出现

预定义字符

\t表示水平制表符tab

\s表示任何空字符,如空格、tab、回车等

还有很多

分组

操作符(如+``*``?)只能影响它前面的术语。使用小括号()可以使操作符作用于一组术语

例子:/(ab)+/会匹配"ab"字符串一次或多次。

☢️歧义:()同时还有捕获的作用。

使用竖线表示或的关系,比如/a|b/匹配a或b,与/[ab]/类似

反向引用

看这个正则/^([abc])a\1)/,其中()为捕获,可能捕获到abc\1就表示被捕获到的那个字符。

比如,对于字符串bab,首先([abc])捕获到了b\1就代表b,所以bab可以匹配。

捕获及捕获的引用

/(hello) (world)/ 在匹配字符串 hello world 时会将 () 中的字符进行捕获,可以用 $1 $2 表示。

string.replace()中,使用"$1"表示被捕获到的字符。

比如,'hello world'.replace(/(hello) (world)/, '$1 666-$2'),会输出"hello 666-world"

(?: . . .)表示非捕获分组,也就是不会被捕获,仅表示分组。

trim()的实现

方法1

str.replace(/^\s+|\s+$/g,""),在头尾分别替换掉空字符

方法2

var str = strings.replace(/^\s\s*/,""), //在头部替换
    ws = /\s/,
    i = str.length;

while(ws.test(str.charAt(--i))); // 看在尾部有几个空字符

return str.slice(0,i+1); // 剔除空字符

方法2比方法1在长文档中性能更好。

其他

匹配换行符

  1. 术语点.不能匹配到换行符\n
  2. /\s*/g匹配不到连续多个空字符,可以用/\s+/g可以。