JS中的正则表达式
JS中的正则表达式
<script type="text/javascript">
/*
var str = 'abc@abc.com';
//1.正则表达式对象
//var reg = new RegExp('\\w+@\\w+\\.\\w+');
//声明正则表达式对象的另外一种方式。
var reg = /\w+@\w+\.\w+/; // (推荐)
var b = reg.test(str); //相当于c#中的IsMatch();//返回布尔类型
alert(b);
function chkAge(cur) {
var reg = /\d+/;
var b = reg.test(cur.value);
alert(b);
}
*/
var str = '中国移动10086.中国联通10010,中国电信10000中国工商银行95588;
//g表示全局模式
//就是每次提取的时候从上一个提取出继续向后找,而不是每次都从索引0开始找。
var reg = /\d\d\d(\d\d)/g;
/*
//exec返回值为一个数组
//result是一个数组,该数组中
//存储的第0个元素是,匹配的结果
//第1个元素是第一个提取组的结果
//第2个元素师第2个提取组的结果
//依次类推
var result = reg.exec(str);
for (var i = 0; i < result.length; i++) {
alert(result[i]);
}
var result1 = reg.exec(str);
alert(result1);
var restul2 = reg.exec(str);
alert(restul2);
*/
//循环提取字符串中的所有满足匹配的正则表达式。
while (true) {
var result = reg.exec(str);
if (result != null) {
for (var i = 0; i < result.length; i++) {
alert(result[i]);
}
} else {
break;
}
}
</script>
JavaScript中创建正则表达式类的方法:
1.var regex = new RegExp("\\d{5}") 或者
2.var regex = / \d{5} /
/表达式/ 是JavaScript中专门为简化正则表达式编写而提供的语法,写在//中的正则表达式就不用管转义符了。
RegExp对象的方法:
(1)test(str)判断字符串str是否匹配正则表达式,相当于c#中IsMatch
var regex = /.+@.+/;
alert(regex.test("a@b.com"));//true
alert(regex.test("ab.com"));//false
(2)exec(str)进行搜索匹配,返回值为匹配结果(*),相当于c#中match()和matches()
如果 exec() 找到了匹配的文本,则返回一个结果数组(完全匹配的字符串以及提取组的结果)。否则,返回 null。 要提取多个需要反复调用exec()类似于matches()方法。
在非全局模式下,调用一次exec()相当于match();在全局模式下连续多次调用相当于matches()
RegExp 对象
RegExp 对象表示正则表达式,它是对字符串执行模式匹配的强大工具。
直接量语法
/pattern/attributes 创建 RegExp 对象的语法:
new RegExp(pattern, attributes); 参数
参数 pattern 是一个字符串,指定了正则表达式的模式或其他正则表达式。
参数 attributes 是一个可选的字符串,包含属性 "g"、"i" 和 "m",分别用于指定全局匹配、区分大小写的匹配和多行匹配。ECMAScript 标准化之前,不支持 m 属性。如果 pattern 是正则表达式,而不是字符串,则必须省略该参数。
返回值
一个新的 RegExp 对象,具有指定的模式和标志。如果参数 pattern 是正则表达式而不是字符串,那么 RegExp() 构造函数将用与指定的 RegExp 相同的模式和标志创建一个新的 RegExp 对象。
如果不用 new 运算符,而将 RegExp() 作为函数调用,那么它的行为与用 new 运算符调用时一样,只是当 pattern 是正则表达式时,它只返回 pattern,而不再创建一个新的 RegExp 对象。
exec() 方法的功能非常强大,它是一个通用的方法,而且使用起来也比 test() 方法以及支持正则表达式的 String 对象的方法更为复杂。
如果 exec() 找到了匹配的文本,则返回一个结果数组。否则,返回 null。此数组的第 0 个元素是与正则表达式相匹配的文本,第 1 个元素是与 RegExpObject 的第 1 个子表达式相匹配的文本(如果有的话),第 2 个元素是与 RegExpObject 的第 2 个子表达式相匹配的文本(如果有的话),以此类推。除了数组元素和 length 属性之外,exec() 方法还返回两个属性。index 属性声明的是匹配文本的第一个字符的位置。input 属性则存放的是被检索的字符串 string。我们可以看得出,在调用非全局的 RegExp 对象的 exec() 方法时,返回的数组与调用方法 String.match() 返回的数组是相同的。
但是,当 RegExpObject 是一个全局正则表达式时,exec() 的行为就稍微复杂一些。它会在 RegExpObject 的 lastIndex 属性指定的字符处开始检索字符串 string。当 exec() 找到了与表达式相匹配的文本时,在匹配后,它将把 RegExpObject 的 lastIndex 属性设置为匹配文本的最后一个字符的下一个位置。这就是说,您可以通过反复调用 exec() 方法来遍历字符串中的所有匹配文本。当 exec() 再也找不到匹配的文本时,它将返回 null,并把 lastIndex 属性重置为 0。
string的正则表达式方法
String对象中提供了一些与正则表达式相关的方法,相当于对于RegExp类的包装,简化调用:
match(regexp),非全局模式下相当于调用exec(),全局模式下相当于调用c#的matches(),返回数组中是所有的匹配结果(不包含提取组的信息)。
var s = "aaa@163.com";
var regex = /(.+)@(.+)/;
var match = s.match(regex);
alert(RegExp.$1 + ",服务器:" + RegExp.$2);
字符串.replace(/(正)则/g,”要替换的字符串$1”);//替换手机号码,只显示后4位。手机尾号为:*******1234
<script type="text/javascript">
var str = "赶快拨打13888888888查话费。13999999999送话费。15888888888定业务。";
//将所有的手机号码前七位都替换成*
str = str.replace(/\d{7}(\d{4})/g, '*******$1');
alert(str);
/*
//提取所有的手机号码
//match方法直接调用相当于非全局模式
//全局模式需要在正则表达式的后面加个g
//通过字符串的match方法快速提取字符串中的匹配。(不要忘记全局模式)
var result = str.match(/(\d{3})\d{4}(\d{3})/g);
//如果正则表达没有加g(全局模式),则match()方法返回结果为一个数组
//里面包含当前提取的字符串以及,字符串提取组的的信息
//但是,当加了g的时候,match()方法返回的结果虽然也是数组,但是里面不再包含提取组的信息了
//而是变成了,所有匹配正则表达式的提取的字符串信息
alert(result);
//RegExp.$1获取第一个提取组的信息
//RegExp.$2获取第二个提取组的信息
//RegExp.$3...依次类推,//当使用g(全局模式时,该提取组的形式只能获取最后一个组信息)
//要想获取每个提取组的信息,请用正则表达式对象.exec()方法。
alert(RegExp.$1 + ',' + RegExp.$2);
*/
</script>