初探JS正则表达式
1.概述
正则表达式是一个描述字符模式的对象。Javascript的正则表达式语法的是Perl5的正则表达式的子集。JS正则表达式有两种使用方式,文本模式和RegExp对象模式,实例如下:
var patern = /java/ig; //文本模式 var patern = new RegExp(/java/, 'ig'); //对象模式
注:ES3中RegExp共用一个对象,ES5每次调用产生一个新对象
2.正则表达式使用的主要字符和元字符
2.1直接量字符
字符
|
匹配
|
字母和数字
|
自身 |
\o
|
NUL字符(\u0000)
|
\t
|
制表符(\u0009)
|
\n
|
换行符(\u000A)
|
\v
|
垂直制表符(\u000B)
|
\f
|
换页符(\u000C)
|
\r
|
回车符(\u000D)
|
\xnn
|
十六进制数,nn指拉丁字符
|
\uxxxxx
|
十六进制数,xxxx指unicode字符 |
\cX
|
控制字符^X
|
2.2字符类
字符
|
匹配
|
[...]
|
方括号内的任意字符
|
[^...]
|
除方括号外的任意字符 |
.
|
除换行符和其他unicode行终止符外的任意字符
|
\w
|
任何ASCII字符组成的单词,等价于[a-zA-Z0-9]
|
\W
|
非ASCII字符组成的单词,等价于[^a-zA-Z0-9]
|
\s
|
任何unicode空白符
|
\S
|
任何非unicode空白符
|
\d |
任何ASCII数字,等价于[0-9]
|
\D
|
非ASCII数字,等价于[^0-9] |
[\b]
|
退格直接量
|
字符
|
含义 |
{n,m}
|
匹配前一项,至少n次,不超过m次,[n,m)
|
{n,} |
匹配前一项,至少n次或者更多次,[n,无穷)
|
{n}
|
匹配前一项n次,==n
|
?
|
匹配前一项,0到1次,0||1 |
+
|
匹配前一项,1到多次,[1,无穷)
|
*
|
匹配前一项,0次到多次,[0,无穷) |
2.4选择、分组和引用字符
字符
|
含义
|
|
|
选择,匹配左边或者右边的表达式
|
(...)
|
分组,可使用重复符进行修饰(记忆) |
(?:...)
|
只组合,不记忆 |
\n |
和第n组,第一次匹配的字符相匹配
|
字符 | 含义 |
^
|
匹配字符串的开头 |
$ |
匹配字符串的结尾
|
\b |
匹配单词的边界符
|
\B
|
匹配单词非边界符 |
(?=p)
|
正向先行断言,都与p匹配但不包含 |
(?!p)
|
负向先行断言,都与p不匹配
|
字符
|
含义
|
i
|
不区分大小写
|
m
|
多行匹配模式
|
g
|
全局匹配
|
3.1String提供了四种支持正则表达式的方法
方法名称
|
使用说明
|
String.search(patern) |
返回第一个与之匹配的子串起始位置,如果找不到就返回-1
|
String.replace(patern, newStr)
|
将匹配的字符串替换成newStr,newStr也可以是动态替换字符串的函数
|
String.match(patern)
|
返回一个有匹配结果组成的数组,如果非全局匹配,第一个是匹配的字符串,后面为分组值
|
String.split(partern)
|
根据规则分割成数组
|
方法名称
|
使用说明
|
RegExp.exec(string)
|
和String的match方法返回值相同,RegExp.lastIndex是全局匹配的下一个匹配项的起始位置
|
RegExp.test(string)
|
当exec不为null时,返回true
|
4.正则表达式简单使用实例
匹配中文字符: [\u4e00-\u9fa5]
匹配首尾空格:(^\s*)|(\s*$)
//获取URL参数 var url = "http://www.cnblogs.com?func=window.getUserName&errno=0"; var splitUrlReg = /\?(\w+)=([^&=]*)(?:&(\w+)=([^&=]*))+/;; var paramArr = url.match(splitUrlReg); console.log(paramArr); //["?func=window.getUserName&errno=0", "func", "window.getUserName", "errno", "0", index: 22, input: "http://www.cnblogs.com?func=window.getUserName&errno=0", clone: function]