正则表达式是一个拆分字符串并查询相关信息的过程;是现代开发中很重要的一环。作为一个web开发人员必须牢牢掌握这项技能,才能尽情得在js中驰骋。
1、创建正则表达式:
正则表达式(regular expression)和Javascript的其他对象类型一样,也就是我们经常看到的RegExp对象,它有二种方式来创建:
第一种:正则字面量形式
var test= /pattern/flags;
第二种:RegExp对象构造函数形式
var test=new RegExp(pattern,flags);
参数pattern是一个字符串,指定了正则表达式的模式。
参数flags包含属性 "g"、"i" 和 "m",分别用于指定全局匹配、区分大小写的匹配和多行匹配。
2、RegExp对象方法:
test():
检测所搜索的字符串是否与该正则模式匹配,返回true或false。
例如:
var a="aaisccc",demo=/\D/,d=demo.test(a);
alert(d);//true
exec(str):
检测所搜索的字符串是否与正则模式匹配,它返回一个数组,其中存放匹配的结果,未找到匹配,则返回null。
参数str表示要匹配正则表达式的字符串。
例子:
var a="1a2b3c456he"; var test=/\d/g; var t; while((t=test.exec(a))!=null){document.write(t);//123456}
上述代码通过循环中反复地调用 exec() 方法,来获得完整的匹配信息。
2.1、String对象的match()、replace()、split()、search()也用到了正则的模式匹配;
一、match方法:
该方法类似 indexOf() ,但是它返回指定的值,而不是字符串的位置。
例子:
var a="1a2b3c456he";
var test=/\d+/g;
var t; t=a.match(test); document.write(t);//[1,2,3,456]
二、replace方法:
语法:string.replace(regexp/substr,replacement)
参数regexp/substr表示子字符串或要替换的模式的 RegExp 对象。
参数replacement表示要替换的文本或函数。此外,replacement 中的 $ 字符具有特定的含义;$1、$2、...、$9表示将要替换与 regexp 中的第 1 到第 9 个子表达式相匹配的文本。
例子:
var a="1a2b3c456d"; var test=/\d+/g; var t; t=a.replace(test,"#"); document.write(t);//#a#b#c#d
去除字符串前后空格:
var a=" 1a2b3c456d "; var test=/(^\s*)|(\s*$)/g; var t; t=a.replace(test,""); document.write(t);//1a2b3c456d
//------------------------------------
// 其中在第二个参数中可以插入回调函数
// 可以将上面的例子改为 t=a.replace(test.fn)
// function fn(){return "";}功能与上面相同
//------------------------------------
三、split方法:
该方法将一个字符串分割为子字符串,然后以字符串数组形式返回。
例子:
var a="a5h4a"; var t; t=a.split(/\d/g); document.write(t);//a,h,a
四、search方法:
该方法搜索与正则表达式相匹配的子字符串。返回与正则匹配到的第一个子串的位置。匹配不到则返回-1。
与indexOf方法不同的是它的参数是强制正则的,如果传入一个非正则表达式对象,则会使用 new RegExp(obj) 隐式地将其转换为正则表达式对象。search() 方法不执行全局匹配,它将忽略标志 g。
例子:
var a="abc5h4a"; var t=a.search(/\d/); document.write(t);//3
我们应了解到正则表达式中所有的字母和数字都是按照字面意思与自身相匹配的,JavaScript的正则表达式还通过以反斜杠(\)开头的转义序列支持某些非字母字符。
正则表达式中的元字符
. 查找任意字符,除了换行和行结束符。等价于[^\n]
\w 查找单词字符。 等价于[a-zA-Z0-9]
\W 查找非单词字符。等价于[^a-zA-Z0-9]
\d 查找数字。 等价于[0-9]
\D 查找非数字字符。等价于[^0-9]
\s 查找空白字符。
\S 查找非空白字符。
\b 匹配单词边界。
\B 匹配非单词边界。
\0 查找 NUL 字符。
\n 查找换行符。
\f 查找换页符。
\r 查找回车符。
\t 查找制表符。
\v 查找垂直制表符。
\xxx 查找以八进制数 xxx 规定的字符。
\xdd 查找以十六进制数 dd 规定的字符。
\uxxxx 查找以十六进制数 xxxx 规定的 Unicode 字符。
方括号"[ ]"
[abc] 查找方括号之间的任何字符。
[^abc] 查找任何不在方括号内的字符。
[0-9] 查找 0 至 9 的数字。
[a-z] 查找小写 a 到 z 的字符。
[A-Z] 查找 A 到Z 的字符。
'^'和'$'
分别表示一个字符串的开始和结束位置。
'*','+'和'?'
这三个符号它们分别表示“0个或更多”,“一个或更多”还有“0个或一个”。
*等价于{0,}
?等价于 {0, 1}
+等价于{1,}
“{}”
{n} 精确匹配n次
{n,} 匹配n次以上
{n,m} 匹配n-m次
选择 “|”
字符| 用于分隔供选择的字符。
分组"()"
还可以分为
•捕获性分组("()")
•非捕获性分组("(?:)")
捕获分组一般使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是此分组捕获的内容)可以在表达式或其它程序中作进一步的处理。默认情况下,每个捕获组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。
例子:
var a="5552-41"; var t=a.replace(/(\d+)-(\d+)/,"$2-$1"); document.write(t);//41-5552
非捕获组只匹配结果,但不捕获结果,也不会分配组号,当然也不能在表达式和程序中做进一步处理。
看个例子:
var a="5552-41"; var t=a.replace(/(?:\d+)-(\d+)/,"$1-$2"); document.write(t);//41-$2 从结果可以看出来,第一个四位数字没有被捕获到。所以$1为(\d{+})捕获的串。
反向引用:
引用前面捕获存储的内容,类似\1,\2这样的语法,来看例子就明白了:
var a="abcddf"; var c=a.match(/([a-f])\1/); document.write(c);//dd,d
// \1是动态确定的,根据前面的捕获组来确定;例如第一次捕获的是a,则将a被放在一个捕获组里,这个捕获组的编号是1;
//因为编号是1的捕获组里存放的是上一步中捕获的a,所以这个\1
就是指代a,所以\1
的意思就是再次匹配a;失败;接着下一轮匹配直到匹配到dd这个字符;成功。