javascript正则表达式
字符匹配
常见匹配字符的元字符:
.
匹配除换行符以外的任意字符。\w
匹配字母或数字或下划线或汉字。\s
匹配任意的空白符。\d
匹配数字。\W
匹配任意不是字母,数字,下划线,汉字的字符。\S
匹配任意不是空白符的字符。\D
匹配任意非数字的字符。
[0-9]
和[^abc]
也都匹配一个字符。
位置匹配
- 除了匹配单个字符,还可以匹配位置。元字符^和$都匹配一个位置。
常见匹配位置的元字符:
\b
匹配单词的开始或结束。^
匹配字符串的开始。$
匹配字符串的结束。\B
匹配不是单词开头或结束的位置。
以下列字符串(
"abc def"
)为例:^
可以匹配到位置0,该位置位于字符串开头。$
可以匹配到位置7,该位置位于字符串结尾。\b
可以匹配到位置0、位置3、位置4、位置7,这些位置位于单词开始或结束处。
分组
()
通过小括号分组匹配多个字符。(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"]
7.根据断言在某个位置插入值
`{{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}$
; - 中文及中文字符:[\u2E80-\u2EFF\u2F00-\u2FDF\u3000-\u303F\u31C0-\u31EF\u3200-\u32FF\u3300-\u33FF\u3400-\u4DBF\u4DC0-\u4DFF\u4E00-\u9FBF\uF900-\uFAFF\uFE30-\uFE4F\uFF00-\uFFEF]
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。