正则表达式

309 阅读3分钟

初识正则表达式

正则表达式是一个描述字符模式的对象,其表达形式为

    const pattern = /s$/;

上面这个简单的正则为匹配所有以"s"结尾的字符串

如果我们采用构造函数的方式也可以定义为

    const pattern = new RegExp("s$");

字符

正则表达式中的字母和数字都是按照字面含量进行匹配的,同时,正则表达式还支持非字母的字符匹配,这里有一张对应的表

特殊字符正则表达式记忆方式
换行符\nnew line
换页符\fform feed
回车\rreturn
空白符\sspace
制表符\ttab
垂直制表符\vvertical tab
回退符[\b]backspace,之所以使用[]符号是避免和\b重复
字符集正则表达式记忆方式
除了换行符之外的任何字符.
单个数字, [0-9]\ddigit
除了[0-9]\Dnot digit
包括下划线在内的单个字符[A-Za-z0-9_]
单词字符\wword
非单字字符\Wnot word
匹配空白字符,包括空格、制表符、换页符和换行符\sspace
匹配非空白字符\Snot space

在正则表达式中,许多符号都有特殊含义,比如:

    . ? ^ $ + = ! : | \ / () [] {}
  • [...] 匹配方括号内任意字符
  • [^...] ^作用为非,这里指的是非匹配方括号内任意字符
  • $ 表示字符结尾

重复

下表是正则表达式的重复语法

字符含义
{m, n}匹配前一项至少m次,最多n次
{n,}匹配前一项至少n次
{n}匹配前一项n次
?匹配前一项0或1次
  • | 匹配前一项1次或者多次,等价于{1,}
  • | 匹配前一项任意次数,等价于{0,}

选择、分组和引用

正则表达式语法还包含指定选项、子表达式分组和前一子表达式特殊字符,我们用“|”表示“或”的关系,用括号()表示分组关系,下面是一些例子

    /ab|cd|ef/  // 可以匹配ab也可以匹配cd也可以匹配ef

需要注意的是选择项的尝试匹配是从左往右,直到发现了匹配项,如果左边匹配项匹配,就忽略右边的匹配项,即使右边匹配项结果更好

    /a/ab/ // 匹配字符串ab是,只能匹配a

正则表达式的括号有多个作用,其中一个作用是把单独的项组合成表达式

/java(script)?/ // 匹配java或者javaScript

另一个左右在于,允许一个表达式中后部引用前面的子表达式

    /([Jj]ava([Ss]cript)?)\sis\s(fun\w*)/ // 嵌套的子表达式([Ss]cript?)可以用/2来表示

而符号?: 表示仅仅进行分组但是不进行引用

    /([Jj]ava(?:[Ss]cript)?)\sis\s(fun\w*)/ //这里的([Ss]cript?)不参与计数,/2表示(fun\w*)

下表是关于选择、分组和引用的总结

字符含义
\选择,表示匹配符号左边或者右边的表达式
(...)组合为一个单元,可以通过? + * 等符号进行修饰,并且可以记住这个组合供后部引用
(?:...)只进行组合,但是不提供引用
\n第n个分组第一次匹配的字符,组索引数是从左往右的括号数,(?:)不参与计数

指定匹配位置

正则表达式的锚字符和修饰符

字符含义
^匹配字符串开头,在多行检索中,匹配一行的开头
$匹配字符串结尾,在多行检索中,匹配一行的末结尾
\b匹配一个单词边界,简单说就是\w和\W中间的部分,或者位于字符\w和字符串开头或者结尾之间的位置,需要注意的是[\b]匹配的是退格符号
\B匹配一个非单词边界
(?=p)正向先行断言,要求接下来的字符都要与p匹配,但是整个正则的匹配结果是不包含p部分
(?!p)负向先行断言,要求接下来的字符都要不p匹配
i不区分大小写(ignore)
m多行匹配(multi) ^匹配字符串开头或者一行开头,$匹配字符串的结尾或者一行的结尾
g全局匹配(global),找到所有匹配项,而不是找到第一个后停止

关于\b的使用

    /\sjava\s/ // 匹配java(前后有空格)
    /\bjava\b/ // 匹配java(前后不包含空格)

关于先行断言使用

    /java(?=script)/  匹配 javascript 匹配结果为java 不匹配javasscript
    /java(?!script)/ 匹配javasscript 匹配结果为java 不匹配javascript

修饰符