正确理解-javascript中的正则表达式-您有几多误区?和表单验证

正确理解--javascript中的正则表达式-您有多少误区?和表单验证

一、字符串的match()方法--正确理解

 

1、在javascript中,字符串可以调用match()方法来匹配字符串。

误区1:这里的match()方法和java中的matches()方法时完全不同的。

在java中是完全匹配,也就是匹配的字符串必须是整个都满足正则表达式。

但是:javascript中的match()是匹配子串,也就是该字符中,有满足正则表达式的就可以。

看代码:

<html>
<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>