正则表达式-语法
正则表达式——语法
正则:就是用有限的符号,表达无限的序列。
两条斜线中间是正则主体,这部分可以有很多字符组成; i部分是修饰符,i的意思是忽略大小写。 eg: /^abc/i
简单字符:
没有特殊意义的字符都是简单字符,简单字符就代表自身,绝大部分字符都是简单字符。eg:
/abc/ // 匹配 abc
/123/ // 匹配 123
/-_-/ // 匹配 -_-
/孩子/ // 匹配 孩子
转义字符
\ 是转义字符,其后面的字符代表不同的意思,转义字符主要有三个作用:
第一种,是为了匹配不方便显示的特殊字符,比如换行,tab符号等
第二种,正则中预先定义了一些代表特殊意义的字符,比如 \w 等
第三种,在正则中某些字符有特殊含义(如下面的),转义字符可以让其显示自身含义
下面是常用转移字符列表:
\n 匹配换行符
\r 匹配回车符
\t 匹配制表符,也就是 tab 键
\v 匹配垂直制表符
\x20 20是2位16进制数字,代表对应的字符
\u002b 002b是4位16进制数字,代表对应的字符
\w 匹配任何一个字母或者数字或者下划线
\w 匹配任何一个字母或者数字或者下划线以外的字符
\s 匹配空白字符,比如空格,tab等
\s 匹配非空白字符
\d 匹配数字字符,0-9
\d 匹配非数字字符
\b 匹配单词的边界
\b 匹配非单词边界
\\ 匹配 \ 本身
字符集合
有时候我们需要匹配一类字符,字符集可以实现这个功能,字符集的语法用 [] 分割:
[abc] // 匹配a或b或c
如果要表示字符很多,可以使用 - 表示一个范围内的字符:
[0123456789]=[0-9]
在前面加个 ^,可表示非的意思,下面的代码能够匹配 a b c 之外的任意字符
[^abc]
其实正则还内置了一些字符集,在上面的转义字符提到,下面给出内置字符集对应的自定义字符集
. 匹配除了换行符(\n)以外的任意一个字符 =[^\n]
\w = [0-9a-za-z_]
\w = [^0-9a-za-z_]
\s = [\t\n\v]
\s = [^\t\n\v]
\d = [0-9]
\d = [^0-9]
量词
如果需要匹配多次某个字符,正则也提供了量词的功能,正则中的量词有多个,如 ? + * {n} {m, n} {m, }
{n} 匹配 n 次,eg:a{2}, 匹配 aa
{m, n} 匹配 m-n 次,优先匹配 n 次,比如 a{1,3},可以匹配 aaa, aa, a
{m,} 匹配 m 次以上,优先匹配 多次,比如 a{1,},可以匹配 aaaa……
? 匹配 0 次或 1 次,优先匹配1次,相当于 {0,1}
+ 匹配 1-n 次,优先匹配n次,相当于{1,}
* 匹配 0-n次,优先匹配n次,相当于{0,}
正则默认是遵从贪婪模式,凡是表示范围的量词,都优先匹配上限而不是下限
a{1,3} // 匹配字符串“aaa”的话,会匹配aaa而不是a
有时我们想要结果,可以在量词后面加上?,就可以开启非贪婪模式
a{1,3}? // 匹配字符串“aaa”的话,会匹配a而不是aaa
字符边界
有时会有边界匹配的要求,比如xxx开头,以xxx结尾
^在[] 外表示匹配开头的意思
^abc // 可以匹配abc,打不能匹配aabc
$表示匹配结尾的意思
abc$ // 可以匹配abc,但不能匹配abcc
\b表示单词边界
abc\b // 可以匹配abc,但不能匹配abcc
选择表达式
有时我们想匹配x或y,如果x和y是单个字符,可以使用字符集,[abc]可以匹配a或b或c;
如果x和y是多个字符,字符集就无能为力了,此时要用到分组:
正则中用 | 来表示分组(或), a|b 表示匹配 a或者b的意思
123|456|789 // 匹配123 或 456 或 789
分组与引用
分组时正则中非常强大的一个功能,可以让上面提到的量词作用于一组字符,而非单个字符,分组的语法是圆括号包裹(xxx)
(abc){2} //匹配abcabc
分组不能放在[]中,分组中还可以使用选择表达式
(123|456){2} // 匹配123123,456456,123456,456123
和分组相关的另一个概念是引用,比如在匹配html标签时,通常希望<xxx></xxx>后面xxx能够和前面保持一致
引用的语法是\数字,数字代表前面第几个捕获分组,注意非捕获分组不能被引用
<([a-z]+)><\/\1> // 可以匹配‘<span></span>’或'<div></div>'等
预搜索
如果你想匹配xxx前不能是yyy,或者xxx后不能使yyy,js只能正向预搜索,也就是xxx后面必须是yyy,或者xxx不能是yyy
1(?=2) // 可以匹配12,不能匹配22
1(?!2) // 可以匹配22,不能匹配12
修饰符
默认正则是区分大小写,/xxx/gi // 后面的g和i就是两个修饰符
g 正则遇到第一个匹配的字符就会结束,加上全局修饰符,可以让其匹配到结束
i 正则默认是区分大小写的,i可以忽略大小写
m 正则默认情况下,^和$只能匹配字符串的开始和结尾,m修饰符可以让^和$匹配行首和行尾,eg:
/jing$/ // 能够匹配 'yanhaijing’,不能匹配 'yanhaijing\n'
/jing$/m //能够匹配‘yanhaijing’,能匹配 ‘yanhaijing\n’
/^jing/ //能够匹配‘jing’,不能匹配‘\njing’
/^jing/m //能匹配‘jing’,能匹配‘\njing’
博客摘自:https://yanhaijing.com/javascript/2017/08/06/regexp-syntax/
上一篇: Python多线程入门学习