前言
对一个程序员来说,正则是不得不了解的东西,日常开发中,用处很多;作为一个前端开发人员,也是常常用到。可以匹配出你自己想要的字段,文件,反正就是很爽。与其到处百度,不如自己掌握;
平时自己练习正则的时候,可以找个在线正则进行练习,就比较方便;
随便推荐一个 在线正则工具
这里主要总结一些正则的实例用法。
一些基本常识
- 1、特殊字符
特殊字符,需要用反斜杠 \ 进行转译
[ ] \ ^ $ . | ? * + ( )
注意: 字符集中只有4个 字符 (字符集后面会说),也就是只有这4个需要转译;
] \ ^ -
“]”代表字符集定义的结束;
“\”代表转义;
“^”代表取反;
“-”代表范围定义
- 2、js正则引擎工作机制—正则向导
即惰性,猴急的;
regex|regex not (这里 | 符合是或者的意思)
匹配 “regex not”
返回 regex
- 3、字符集
正则表达式引擎仅仅匹配多个字符中的一个
<<q[^u]>>:匹配一个q,后面跟着一个不是u的字符
比如匹配 "hellow quite qi"
返回qi,而不是q,或者qu;
- 4、使用?*或+ 进行重复
?:告诉引擎匹配前导字符0次或一次。
+:告诉引擎匹配前导字符1次或多次 {1,}
*:告诉引擎匹配前导字符0次或多次 {0,}
“+”是贪婪的
“?*”的重复也是贪婪的
举个例子
'This is a <EM>first</EM> test'.match(/<.+>/)
返回'<EM>first</EM>',而不是<EM>,
. 理论上匹配任何字符
因为贪婪的意思就是尽可能多的返回的意思,所以第一个">"也是.的范围,直到匹配到最后一个“>”。
解决办法一:
“+”的惰性代替贪婪性
“+”后面紧跟一个问号“?”,问号的意思就是0次或者1次
'This is a <EM>first</EM> test'.match(/<.+?>/)
就返回的<EM>
'This is a <EM>first</EM> test'.match(/<.+?>/g)
就返回的<EM>和</EM>,g的意思就是全局的意思,加个m就是匹配多行的意思,加个i就是不区分大小写;
就这样用,意思是全局匹配,不区分大小写
'This is a <EM>first</Em> test'.match(/<.+?>/ig)
最后返回<EM>,和</Em>;
解决办法二:
'This is a <EM>first</EM> test'.match(/<[^>]+>/)
^ 是非的意思
[^>] 不是>的一个字符
解释是,匹配一个< 及不是>的所有字符1到多次(最好多次,贪婪),再加一个>,
更好,因为,使用取反字符集则不需要进行回溯。
- 5、位置锚定
^ 匹配一行字符串第一个字符前的位置
$ 匹配字符串中最后一个字符的后面的位置
(?<!a)b 匹配一个b前面,没有a的b,向后查看
q(?!u) 匹配一个q,后面没有u的q,向前查看
q(?=?) 匹配一个q,后面等于?
这里的前后很好理解
比如 ‘hello quite qq', 字符串,从左到右是匹配的顺序,比如匹配到p的时候,要看后面有没有u,那么对引擎来说,就是向前查看,
判断q前面有没有u的话,引擎就要回溯上个匹配字符,所以就是向后的看了,
注意:js目前不支持向前查看,有些浏览器有,兼容不好,慎用。
- 6、多行匹配
'first line\n\r first line'.match(/line$/mg)
返回["line", "line"]
网友评论