一、字符串的match()方法--正确理解
1、在javascript中,字符串可以调用match()方法来匹配字符串。
误区1:这里的match()方法和java中的matches()方法时完全不同的。
在java中是完全匹配,也就是匹配的字符串必须是整个都满足正则表达式。
但是:javascript中的match()是匹配子串,也就是该字符中,有满足正则表达式的就可以。
看代码:
<head>
<title>正则表达式</title>
<meta http-equiv="content-type" content="charset=gbk">
<script type="text/javascript">
var srt="1234562347";
var s=srt.match('234');
//如果整个匹配就不满足,但是匹配字串就满足
document.write(s);
</script>
</head>
<body>
</body>
</html>
误区2:match()返回的是存放匹配结果的数组,而不是字符串,该数组元素就是匹配的子串,匹配到的话大小就为1
var s=srt.match('234');
s是数组,打印他的长度可以知道是1,注意,如果我们直接输出一个数组,也是可以的他会将里面的元素用
,隔开,当只有一个元素的时候也就是没有,了。
注意:虽然它是匹配字串,但是他也是懒惰的,只会返回第一个匹配的字符串,
我们可以通过查看数组的大小和元素来验证,下面的代码中,字符串有两个子字符串满足,但是返回的数组长度还是1。
看代码:
<html>
<head>
<title>正则表达式</title>
<meta http-equiv="content-type" content="charset=gbk">
<script type="text/javascript">
var srt="1234234567";
var s=srt.match('234');
//如果整个匹配就不满足,但是匹配字串就满足
document.write(s.length+"<br/>");
document.write(s+"<br/>");
</script>
</head>
<body>
</body>
误区3、表单验证
有了上面的理解,我们在做表单验证的时候,需要匹配整个字符串是不是满足?但是我们又没有整个匹配的方法,注意javascript没有提供全局匹配的方法。
我们得到匹配的子符串,这个时候拿来和原来的整个字符串比较,如果是相等,那么就满足,这里需要注意返回的变量是个数组,如果去比较返回值的长度和原来字符串的长度是不合理的。
如果我们要得到所有满足的子串怎么办呢?下面介绍正则表达式对象。
二、正则表达式对象。
1、对象实例化的语法。
new RegExp(pattern, attributes);
参数
参数 pattern 是一个字符串,指定了正则表达式的模式或其他正则表达式。
参数 attributes 是一个可选的字符串,包含属性 "g"、"i" 和 "m",分别用于指定全局匹配、区分大小写的匹配和多行匹配。ECMAScript 标准化之前,不支持 m 属性。如果 pattern 是正则表达式,而不是字符串,则必须省略该参数。
返回值
一个新的 RegExp 对象,具有指定的模式和标志。如果参数 pattern 是正则表达式而不是字符串,那么 RegExp() 构造函数将用与指定的 RegExp 相同的模式和标志创建一个新的 RegExp 对象。
如果不用 new 运算符,而将 RegExp() 作为函数调用,那么它的行为与用 new 运算符调用时一样,只是当 pattern 是正则表达式时,它只返回 pattern,而不再创建一个新的 RegExp 对象。
2、方法
方法 | 描述 | ||
---|---|---|---|
compile | 编译正则表达式。 | ||
exec | 检索字符串中指定的值。返回找到的值,并确定其位置。 | ||
test | 检索字符串中指定的值。返回 true 或 false。 |
主要介绍exec()方法误区:
其实这里的 exec() 方法和上面将的match()方法他的执行是一样的,也是懒惰的也只会执行一次,返回值
也是一个数组。
特点: RegExpObject 的 lastIndex 属性
正则表达式对象有lastIndex 属性,他保留了匹配到的字符串在它原来自己字符串中的位置,当这个正则表达式对象再一次调用exec() 方法的时候,该方法就会从这个位置之后去查找,如果没有匹配的就会返回null
解决问题:现在就可以得到所有满足的子串了。
看代码:
<html>
<head>
<meta http-equiv="content-type" content="charset=gbk">
<title>正则表达式 </title>
<script type="text/javascript">
//语法new RegExp(pattern, attributes);
var reg= new RegExp('\\b\\d{1,3}\\b','g');
var array= new Array();
var i=0;
//这里有三个满足的子串
array[0]=reg.exec('11 222 1');
while(array[i]!=null){
i++;
array[i]=reg.exec('11 222 1');
}
document.write("数组"+array+"<br/>");
</script>
</head>
<body>
</body>
</html>