Javascript中提供了正则表达式的相关类RegExp,通过该对象,用户可以自定义模式来对字符串进行匹配。
另外,Javascript中String对象的replace方法也支持使用正则表达式对串进行匹配。
Javascript中RegExp对象实现了perl正则表达式的一个子集。
1、元字符与特殊字符:
1.1、元字符:
元字符 含义
^ 串的开始
$ 串的结束
- 零到多次匹配
- 一到多次匹配
? 零或一次匹配
\b 单词边界
1.2、特殊字符串:
字符 含义
字符本身 匹配字符本身
\r 匹配回车
\n 匹配换行
\t 制表符
\f 换页
\x# 匹配十六进制数
\cX 匹配控制字符
1.3、范围及重复:
标志符 含义
[…] 在集合中的任一个字符
[^…] 不在集合中的任一个字符
. 出\n之外的任一个字符
\w 所有的单字,包括字母,数字及下划线
\W 不包括所有的单字,\w的补集
\s 所有的空白字符,包括空格,制表符
\S 所有的非空白字符
\d 所有的数字
\D 所有的非数字
\b 退格字符
下面是一个邮件的正则表达式例子:
//email正则表达式
var emailReg = /[1]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/;
alert(emailReg.test("pzx@itzhai.com"));
//匹配Java中的变量
var javaCon = /[a-zA-Z_][a-zA-Z0-9_]*/;
alert(javaCon.test("jason1_2"));
2、设置重复字符个数范围的方式:
标记 含义
{n} 重复n次
{n,} 重复n或更多次
{n,m} 重复至少n次,至多m次
//手机号码
var mphone = /\d{11}/;
3、分组与引用:
正则表达式中括号的作用:
① 表示括号部分的可有可无:
h(elp) //h必选,elp可选
② 表示分组
使用括号进行分组,当正则表达式执行完成之后与之配对的文本将会按照规则填入各组,并保存到一个数组中:
var pattern = /\w{4}(\d{4})(\w{2})/;
var result = pattern.exec("abcd1989js");
alert(result[0]); //匹配到的整个字符串abcd1989js
alert(result[1]); //匹配到的第一个分组1989
alert(result[2]); //匹配到的第二个分组js
③ 括号用来作为辅助作用
当使用括号括起了一些正则匹配字符,后面要引用这个括号中的匹配规则,可以使用\1(表示第一个分组)\2(表示第二个分组)
var pattern1 = /['"][^'"]*['"]/;
var str1 = "\'Good job!!!\"";
alert(pattern1.exec(str1)); //匹配到'Good job!!!"
var pattern2 = /(['"])[^'"]*\1/;
var str2 = "\"Good job!!!\"";
alert(pattern2.exec(str1)); //null
第二个输出为null,没有匹配到,就是说,如果要在运行时才能知道第一个匹配到是什么而第二个匹配点又需要第一个相同的话,就得使用括号复制,并使用\1来引用这个分组。
4、使用正则表达式:
4.1、创建正则表达式的方法:
① 使用字面量
var regex = /pattern/[switchs];
② 使用RegExp
var regex = new RegExp("pattern", switchs);
其中switchs(开关)有如下三种:
修饰符 描述
i 忽略大小写开关
g 全局搜索开关
m 多行搜索开关(重定义^与$的意义)
var pattern = /[a-z]*/i; //忽略大小写
var str = "AbAbAaB";
alert(pattern.exec(str)); //匹配到AbAbAaB
4.2、RegExp对象提供的匹配方法:
方法名 描述
test() 测试模式是否匹配
exec() 对串进行匹配
compile() 编译正则表达式
其中test方法值测试是否匹配,返回布尔值 exec匹配字符串,并返回需要分组的信息,返回一个数组 compile表示改变表达式的模式,和重新声明一个正则表达式对象的作用相同。
5、其他类中的提供的正则表达式匹配功能
5.1、String类中的正则表达式:
String中提供了与正则表达式操作相关的函数:
方法 作用
match 匹配正则表达式,返回匹配数组
replace 替换
split 分割
search 查找,返回首次发现的位置
match例子:
var str = "Welcome to http://www.itzhai.com";
var result = str.match(/el|ht/g); //返回数组["el","ht"]
alert(result);
replace例子:
var str = "Welcome to http://www.itzhai.com";
var result = str.replace(/www./g, ""); //把www.替换成空
alert(result); //Welcome to http://itzhai.com
replace方法不会影响到原来的字符串,而是返回一个被处理后的新的字符串
如果想在这里使用分组引用,可以使用$n:
var str = "Welcome to http://www.itzhai.com";
var result = str.replace(/(\w+)\s(\w+)/g, "$2 ? $1");
alert(result); //to ? Welcome http://www.itzhai.com
split例子:
var str = "1234:5678:9012";
var result = str.split(/:/); //返回一个数组[1234,5678,9012]
alert(result);
split使用给出的正则匹配规则把原有的字符串分成一个数组
search例子:
search就是查找匹配的文本在字符串中的位置,如果没有找到返回-1:
var str = "1234:5678:9012";
var index = str.search(/:/); //4
alert(index);
\w- ↩︎