正则表达式(javascript)
字符匹配
- 常见匹配字符的元字符:
.匹配除换行符以外的任意字符。\w匹配字母或数字或下划线或汉字。\s匹配任意的空白符。\d匹配数字。\W匹配任意不是字母,数字,下划线,汉字的字符。\S匹配任意不是空白符的字符。\D匹配任意非数字的字符。
[0-9]和[^abc]也都匹配一个字符。
位置匹配
- 除了匹配单个字符,还可以匹配位置。元字符^和$都匹配一个位置。
- 常见匹配位置的元字符:
\b匹配单词的开始或结束。^匹配字符串的开始。$匹配字符串的结束。\B匹配不是单词开头或结束的位置。
- 以下列字符串(
"abc def")为例:^可以匹配到位置0,该位置位于字符串开头。$可以匹配到位置7,该位置位于字符串结尾。\b可以匹配到位置0、位置3、位置4、位置7,这些位置位于单词开始或结束处。
- 下列正则可以匹配到单词开头和结尾的位置,然后替换成"_"。
`happy friendly tidy`.replace(/\b/g, '_')
// "_happy_ _friendly_ _tidy_"
分组
()通过小括号分组匹配多个字符。(abc)匹配abc三个字符。
重复匹配
- 限定符:
*重复零次或更多次。+重复一次或更多次。?重复零次或一次。{n}重复n次。{n,}重复n次或更多次。{n,m}重复n到m次。
- 重复单个字符。
.+,[0-9]*。 - 重复多个字符。
(abc){2, 5}。 - 默认的贪婪模式,尽可能多的匹配。例如,正则
1.*3全局查找字符串12313,匹配结果为12313。 - 限定符后面添加
?,则匹配模式为非贪婪模式,尽可能少的匹配。例如,正则1.*3全局查找字符串12313,匹配结果为123、13。
条件匹配
1.(a|b)匹配包含a或b的字符。
2.abc|def匹配包含abc或def的字符。
3.^abc|def$匹配abc开头或者def结尾的字符。
4.^(abc|def)$只匹配abc或def这两个字符。
引用
()指定子表达式后,匹配子表达式的文本(分组捕获的内容)可以在表达式或其它程序中作进一步的处理。- 默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2。
'<html></html>'.match(/<(.+?)><\/\1>/)中\1代表分组1匹配的文本。(?<Name>)指定子表达式的组名(Name),\k<Name>引用捕获的内容。'<html></html>'.match(/<(?<tag>.+?)><\/\k<tag>>/)组名为tag。
零宽度断言
- 和\b,^,$相同,属于位置匹配,这个位置应该满足一定的条件。
- (?=exp)零宽度正预测先行断言,匹配的位置后面需要满足exp条件。比如
\b\w+(?=ion\b),匹配谁后面有ion结尾,则查找position relative时,它会匹配posit。 - (?<=exp)零宽度正回顾后发断言,匹配的位置前面需要满足exp条件。比如
(?<=\bun)\w+\b,匹配谁前面有un开头,则查找see unreal时,它匹配real。 - (?!exp)零宽度负预测先行断言,匹配的位置后面不满足exp条件。比如
\abc(?!\d)匹配后面没有数字的abc,则查找abc1 abcd时,它匹配是后面的abc。 - (?<!exp)零宽度正回顾后发断言,匹配的位置前面不满足exp条件。比如
\(?<!\d)abc匹配前面没有数字的abc,则查找abc 1abc时,它匹配是前面的abc。 12(?!\d)全局匹配下列字符串的过程:- 正则表达式的字符"1"获取控制权,开始配置字符,从第1个字符开始匹配,匹配字符"1"成功,然后控制权转交给"2",从第2个字符继续匹配,匹配成功,然后控制权转交给
(?!\d),它从位置2开始匹配,要求位置后面不是数字,匹配成功。 - 此时得到了第一个匹配结果,继续查找其他匹配结果。
- 字符"1"重新获取控制权,从第3个字符开始匹配,匹配失败。
- 字符"1"重新获得控制权,从第4个字符开始匹配,匹配成功,控制权转交给"2",从第5个字符继续匹配,匹配成功,然后控制权转交给
(?!\d),匹配位置5,要求位置后面不是数字,而该位置后面是数字,匹配失败。 - 字符"1"重新获取控制权,返回到第5个字符开始匹配,匹配失败。
- 字符"1"重新获取控制权,从第6个字符开始匹配,匹配成功,控制权转交给字符"2",从第7个字符继续匹配,匹配成功,然后控制全交给
(?!\d),匹配位置7,该位置后面不是数字,匹配成功。 - 此时得到了第二个匹配结果,整个字符串也查找结束。
- 最终配置的结果就是该字符串前后的
12,不匹配中间的12。
- 正则表达式的字符"1"获取控制权,开始配置字符,从第1个字符开始匹配,匹配字符"1"成功,然后控制权转交给"2",从第2个字符继续匹配,匹配成功,然后控制权转交给
'12a1212'.match(/12(?!\d)/g)
// ["12", "12"]
- 根据断言在某个位置插入值
`{{deviceData.diskUsage}}`.replace(/(?<=\{\{[a-zA-Z\s\.]+)(?=\}\})/, ' | deVal')
// "{{deviceData.diskUsage | deVal}}"
常见正则表达式校验
- IP:
^((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.){3}(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])$; - MAC:
^([0-9A-F]{2}:){5}[0-9A-F]{2}$;