关于js正则验证的几种方式

关于js的正则表达式验证,相信大家都用过,在网上一搜一大堆。但是仔细看看,会有好几种验证的方法,比如test,exec,search,match。

上面的方法都是可以用作正则验证的,那么js中到底有几种正则验证的方法?他们的区别又是什么?


下面开始研究这几种方法的使用。

先写个html用于实验:

<html>
<head>
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
   <meta name="author" content="lushuaiyin">
   <script src="jquery-1.7.1.js" type="text/javascript"></script>
</head>

<body style=" overflow-y:scroll;overflow-x:auto;">
 输入需要校验的字符串:<input type="text" id="checkdata" value="" size="100" 
 style="background-color:#EEEEE0;"/>
 <br><br>

<font style="color:blue;padding-right:75px;">选择校验方法(RegExp对象):</font>
<select style="width: 178px; height: 21px;" id="checkmethod" >
   <option value='pattern_func1'>pattern_func1</option>
   <option value='regExp_func1'>regExp_func1</option>
   <option value='pattern_func_compile'>pattern_func_compile</option>
   <option value='regExp_func_compile'>regExp_func_compile</option>
   <option value='pattern_func_exec'>pattern_func_exec</option>
   <option value='regExp_func_exec'>regExp_func_exec</option>
</select>
<input type="button" οnclick="check()" value="校验" style="width:100px;"/><br><br><br>

<font style="color:blue;padding-right:75px;">选择校验方法(string对象):</font>
<select style="width: 178px; height: 21px;" id="checkmethodstr" >
   <option value='string_search'>string_search</option>
   <option value='string_match'>string_match</option>
</select>
<input type="button" οnclick="checkstr()" value="校验" style="width:100px;"/><br><br><br>


校验结果:<br>
<textarea id="strarea" cols="100" rows="10"  style="background-color:#EAEAEA;">
</textarea>
</body>
</html>
        
<script>
//var path=document.getElementById("path").value;




function pattern_func1(str){
   //正则对象的简易声明方式
   var pattern=/^[A-Za-z0-9_-]+$/;  //可以输入英文字母,数字,下划线,横杠
   return pattern.test(str);
}


function pattern_func_compile(str){
	//正则对象的简易声明方式
   var pattern=/^[A-Za-z0-9_-]+$/;  //可以输入英文字母,数字,下划线,横杠

   var newpattern=/^[0-9]+$/;  //可以输入数字,测试
   pattern.compile(newpattern);//重新编译正则表达式,使上面的pattern失效

   return pattern.test(str);
}


function pattern_func_exec(str){
	//正则对象的简易声明方式
    var pattern=/^[A-Za-z0-9_-]+$/;  //可以输入英文字母,数字,下划线,横杠
    var res=pattern.exec(str);
	if(res==null){
	   return false;
	}else{
	   return true;
	}
}

   
/上面的3个方法其实和下面的等同,正则对象的声明有两种方式

function regExp_func1(str){
   //正则对象的标准声明方式,RegExp
   var pattern=new RegExp(/^[A-Za-z0-9_-]+$/);  //可以输入英文字母,数字,下划线,横杠
   return pattern.test(str);
}

function regExp_func_compile(str){
   //正则对象的标准声明方式,RegExp
   var pattern=new RegExp(/^[A-Za-z0-9_-]+$/);  //可以输入英文字母,数字,下划线,横杠

   var newpattern=/^[0-9]+$/;  //可以输入数字,测试
   pattern.compile(newpattern);//重新编译正则表达式,使上面的pattern失效

   return pattern.test(str);
}

function regExp_func_exec(str){
	//正则对象的标准声明方式,RegExp
    var pattern=new RegExp(/^[A-Za-z0-9_-]+$/);  //可以输入英文字母,数字,下划线,横杠
    var res=pattern.exec(str);
	if(res==null){
	   return false;
	}else{
	   return true;
	}
}

///

/*
以上6个方法表名正则对象的简易或标准声明方式都是一样的,没有区别。
同时,测试了正则对象RegExp的3个方法,test,compile,exec。
最常用的就是test和exec。

//var pattern=new RegExp(/^[A-Za-z0-9_-]+$/);
//alert(typeof pattern);//object
//alert(pattern instanceof RegExp);//true

//var sss="sss";
//alert(typeof sss);//string

test,compile,exec是RegExp对象的方法,js中字符串对象string也有一些方法,可以作为正则验证使用。




*/



//校验
function check(){
   var checkmethod=$.trim($("#checkmethod").val());
   var checkdata=$.trim($("#checkdata").val());
   //校验不做非空验证,前提字符串非空
   if(checkdata==null||checkdata==''){
	   $("#strarea").val("请输入内容。");
     return;
   }
   if(checkmethod=='pattern_func1'){
     var result=pattern_func1(checkdata);
   }else if(checkmethod=='regExp_func1'){
     result=regExp_func1(checkdata);
   }else if(checkmethod=='pattern_func_compile'){
     result=pattern_func_compile(checkdata);
   }else if(checkmethod=='regExp_func_compile'){
     result=regExp_func_compile(checkdata);
   }else if(checkmethod=='pattern_func_exec'){
     result=pattern_func_exec(checkdata);
   }else if(checkmethod=='regExp_func_exec'){
     result=regExp_func_exec(checkdata);
   }

   $("#strarea").val("使用方法:"+checkmethod+",结果:"+result+"。");
}



//校验string的校验
function checkstr(){
   var checkmethod=$.trim($("#checkmethodstr").val());
   var checkdata=$.trim($("#checkdata").val());
   //校验不做非空验证,前提字符串非空
   if(checkdata==null||checkdata==''){
	   $("#strarea").val("请输入内容。");
     return;
   }
   if(checkmethod=='string_search'){
     var result=string_search(checkdata);
   }else if(checkmethod=='string_match'){
     result=string_match(checkdata);
   }

   $("#strarea").val("使用方法:"+checkmethod+",结果:"+result+"。");
}

function string_search(str){
    var pattern=/^[A-Za-z0-9_-]+$/;  //可以输入英文字母,数字,下划线,横杠
    var index=str.search(pattern);
	if(index==-1){
	   return false;
	}else{
	   return true;
	}
}


function string_match(str){
    var pattern=/^[A-Za-z0-9_-]+$/;  //可以输入英文字母,数字,下划线,横杠
    var res=str.match(pattern);
	if(res==null){
	   return false;
	}else{
	   return true;
	}
}

一下是对match的g参数使用实验
//string_match_global("a88**66");//测试,结果a88,66
function string_match_global(str){
    var pattern=/[A-Za-z0-9_-]+/g;  //没有限制开始位置和结束位置,并且使用了g参数
    var res=str.match(pattern);
	if(res==null){
	   return false;
	}else{
	   alert(res.join());
	   return true;
	}
}

//string_match_noglobal("a88**66");//测试,结果a88
function string_match_noglobal(str){
    var pattern=/[A-Za-z0-9_-]+/;  //没有限制开始位置和结束位置,并且不使用g参数
    var res=str.match(pattern);
	if(res==null){
	   return false;
	}else{
	   alert(res.join());
	   return true;
	}
}
//可见match需找匹配时,如果不使用开始^和结束$位置,那么g参数对结果又影响
//使用g参数,match会吧所有的匹配找出返回数组;不使用g参数,match只找到第一个匹配的字符串。
//一般使用g参或者使用i参数,是为了找出匹配的字串,作为结果需要返回的。
//如果只是想验证字符串是否符合格式,那么必然会用到开始^和结束$位置的限制符,就没有必要再加上g或者i参数了



/string对象还有replace和split方法,参数其实是正则表达式
function string_replace(str){
    var pattern=/[0-9]+/;  //没有限制开始位置和结束位置,并且不使用g参数
    var res=str.replace(pattern,'N');
	return res;
}
//alert(string_replace('abc123cde45'));//abcNcde45,结果把搜索到的第一个数字替换成了“N”

function string_replace_g(str){
    var pattern=/[0-9]+/g;  //没有限制开始位置和结束位置,使用g参数,全局搜索
    var res=str.replace(pattern,'N');
	return res;
}
//alert(string_replace_g('abc123cde45'));//abcNcdeN,结果把搜索到的数字替换成了“N”



function string_split(str){
    var pattern=/[0-9]+/;  //没有限制开始位置和结束位置,并且不使用g参数
    var res=str.replace(pattern,'H');
	return res;
}
//alert(string_split('abc123cde45fg'));//abcHcde45fg,结果把搜索到的第一个数字替换成了“H”


function string_split_g(str){
    var pattern=/[0-9]+/g;  //没有限制开始位置和结束位置,使用g参数,全局搜索
    var res=str.replace(pattern,'N');
	return res;
}
//alert(string_split_g('abc123cde45fg'));//abcHcdeHfg,结果把搜索到的数字替换成了“H”

</script>

通过上面的实验可以看出,正则表达式的使用大概分2类。

一类是js的正则对象RegExp,例test,compile,exec。

另一类是使用字符串本身的方法,例search,match,replace,split。


他们的区别在上面的实验也可以看出来了,其复杂度也不一样。

在使用正则的实际情况大多数是验证表单的值符不符合要求,比如邮箱。

这样我们就不再考虑上述可方法的高级使用,这样感觉会很乱,我们就研究表单验证

的情况,上面方法的使用。


所以可以看出,有4个方法是可以用的,test ,exec ,search ,match。

这四个方法完全可以实现相同的功能逻辑。

下面给出一个例子,比如我需要验证数字,英文,邮箱,IP。

我分别使用这4个方法来实现。通过这个例子,下次再使用正则验证时,

我们就不必纠结与那个方法是对的,那个方法好用。


代码:

regex_lushuaiyin.js

//js正则对象RegExp的test方法
var UtilTest={
        isNumber:function(str){
		  var pattern=/^\d+$/;  //数字(\d 匹配一个数字字符。等价于[0-9]。)
          return pattern.test(str);
		}
		,isEnglish:function(str){//英文字母
		  var pattern=/^[A-Za-z]+$/;;  
          return pattern.test(str);
		}
		,isEmail:function(str){//电子邮件
		  var pattern=/^[a-z\d]+(\.[a-z\d]+)*@([\da-z](-[\da-z])?)+(\.{1,2}[a-z]+)+$/; 
          return pattern.test(str);
		}
		,isIP:function(str){//IP 地址
		  var pattern=/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/; 
          return pattern.test(str);
		}//从这里还可以加入你需要的验证
}

//功能同上,只是换成js正则对象RegExp的exec方法来判断
var UtilExec={
        isNumber:function(str){
		  var pattern=/^\d+$/;  //数字(\d 匹配一个数字字符。等价于[0-9]。)
		  var res=pattern.exec(str);
		  if(res==null){
			  return false;
		  }else{
			  return true;
		  }
		}
		,isEnglish:function(str){//英文字母
		  var pattern=/^[A-Za-z]+$/;;  
          var res=pattern.exec(str);
		  if(res==null){
			  return false;
		  }else{
			  return true;
		  }
		}
		,isEmail:function(str){//电子邮件
		  var pattern=/^[a-z\d]+(\.[a-z\d]+)*@([\da-z](-[\da-z])?)+(\.{1,2}[a-z]+)+$/; 
          var res=pattern.exec(str);
		  if(res==null){
			  return false;
		  }else{
			  return true;
		  }
		}
		,isIP:function(str){//IP 地址
		  var pattern=/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/; 
          var res=pattern.exec(str);
		  if(res==null){
			  return false;
		  }else{
			  return true;
		  }
		}//从这里还可以加入你需要的验证
}

//功能同上,只是换成string对象的search方法来判断
var UtilSearch={
        isNumber:function(str){
		  var pattern=/^\d+$/;  //数字(\d 匹配一个数字字符。等价于[0-9]。)
		  var index=str.search(pattern);
		  if(index==-1){
			 return false;
		  }else{
			 return true;
		  }
		}
		,isEnglish:function(str){//英文字母
		  var pattern=/^[A-Za-z]+$/;;  
          var index=str.search(pattern);
		  if(index==-1){
			 return false;
		  }else{
			 return true;
		  }
		}
		,isEmail:function(str){//电子邮件
		  var pattern=/^[a-z\d]+(\.[a-z\d]+)*@([\da-z](-[\da-z])?)+(\.{1,2}[a-z]+)+$/; 
          var index=str.search(pattern);
		  if(index==-1){
			 return false;
		  }else{
			 return true;
		  }
		}
		,isIP:function(str){//IP 地址
		  var pattern=/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/; 
          var index=str.search(pattern);
		  if(index==-1){
			 return false;
		  }else{
			 return true;
		  }
		}//从这里还可以加入你需要的验证
}


//功能同上,只是换成string对象的match方法来判断
var UtilMatch={
        isNumber:function(str){
		  var pattern=/^\d+$/;  //数字(\d 匹配一个数字字符。等价于[0-9]。)
		  var res=str.match(pattern);
	      if(res==null){
	         return false;
	      }else{
	         return true;
	      }
		}
		,isEnglish:function(str){//英文字母
		  var pattern=/^[A-Za-z]+$/;;  
          var res=str.match(pattern);
	      if(res==null){
	         return false;
	      }else{
	         return true;
	      }
		}
		,isEmail:function(str){//电子邮件
		  var pattern=/^[a-z\d]+(\.[a-z\d]+)*@([\da-z](-[\da-z])?)+(\.{1,2}[a-z]+)+$/; 
          var res=str.match(pattern);
	      if(res==null){
	         return false;
	      }else{
	         return true;
	      }
		}
		,isIP:function(str){//IP 地址
		  var pattern=/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/; 
          var res=str.match(pattern);
	      if(res==null){
	         return false;
	      }else{
	         return true;
	      }
		}//从这里还可以加入你需要的验证
}

页面:

<html>
<head>
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
   <meta name="author" content="lushuaiyin">
   <script src="jquery-1.7.1.js" type="text/javascript"></script>
   <script src="regex_lushuaiyin.js" type="text/javascript"></script>
</head>

<body style=" overflow-y:scroll;overflow-x:auto;">
 输入需要校验的字符串:<input type="text" id="checkdata" value="" size="100" 
 style="background-color:#EEEEE0;"/>
 <br><br>

<font style="color:blue;padding-right:5px;">选择校验工具和方法:</font>
  <input type="radio"  name="checkutil" value="UtilTest" checked/>UtilTest工具  
  <input type="radio"  name="checkutil" value="UtilExec" />UtilExec工具  
  <input type="radio"  name="checkutil" value="UtilSearch" />UtilSearch工具  
  <input type="radio"  name="checkutil" value="UtilMatch" />UtilMatch工具  

<select style="width: 178px; height: 21px;" id="checkmethod" >
   <option value='isNumber'>isNumber</option>
   <option value='isEnglish'>isEnglish</option>
   <option value='isEmail'>isEmail</option>
   <option value='isIP'>isIP</option>
</select>
<input type="button" οnclick="check()" value="校验" style="width:100px;"/><br><br><br>



校验结果:<br>
<textarea id="strarea" cols="100" rows="10"  style="background-color:#EAEAEA;">
</textarea>
</body>
</html>
        
<script>
//var path=document.getElementById("path").value;





///





//校验
function check(){
   var checkutil=$.trim($(":radio[name='checkutil']:checked").val());
   var checkmethod=$.trim($("#checkmethod").val());
   var checkdata=$.trim($("#checkdata").val());
   //校验不做非空验证,前提字符串非空
   if(checkdata==null||checkdata==''){
	   $("#strarea").val("请输入内容。");
     return;
   }
   
   //这里为了使if..else逻辑简单些,使用了eval方法,其实就是先确定工具,再确定工具中的方法
   if(checkmethod=='isNumber'){
     var result=eval(checkutil+'.isNumber("'+checkdata+'")' );//相当于计算UtilTest.isNumber(checkdata)
   }else if(checkmethod=='isEnglish'){
     result=eval(checkutil+'.isEnglish("'+checkdata+'")' );
   }else if(checkmethod=='isEmail'){
     result=eval(checkutil+'.isEmail("'+checkdata+'")' );
   }else if(checkmethod=='isIP'){
     result=eval(checkutil+'.isIP("'+checkdata+'")' );
   }

   $("#strarea").val("使用工具"+checkutil+"的方法:"+checkmethod+",结果:"+result+"。");
}


</script>

在这个页面我们可以选择这4中方式来验证,看看有没有差异。

########################################################################

下面是各个方法的api

JavaScript RegExp 对象
创建 RegExp 对象的语法:


直接量语法
/pattern/attributes

new RegExp(pattern, attributes);


参数 pattern 是一个字符串,指定了正则表达式的模式或其他正则表达式。
参数 attributes 是一个可选的字符串,包含属性 "g"、"i" 和 "m",分别用于指定全局匹配、区分大小写的匹配和多行匹配。ECMAScript 标准化之前,不支持 m 属性。如果 pattern 是正则表达式,而不是字符串,则必须省略该参数。
返回值
一个新的 RegExp 对象,具有指定的模式和标志。如果参数 pattern 是正则表达式而不是字符串,那么 RegExp() 构造函数将用与指定的 RegExp 相同的模式和标志创建一个新的 RegExp 对象。
如果不用 new 运算符,而将 RegExp() 作为函数调用,那么它的行为与用 new 运算符调用时一样,只是当 pattern 是正则表达式时,它只返回 pattern,而不再创建一个新的 RegExp 对象。
抛出
SyntaxError - 如果 pattern 不是合法的正则表达式,或 attributes 含有 "g"、"i" 和 "m" 之外的字符,抛出该异常。
TypeError - 如果 pattern 是 RegExp 对象,但没有省略 attributes 参数,抛出该异常。
修饰符
修饰符 描述
i 执行对大小写不敏感的匹配。
g 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。
m 执行多行匹配。
##################################################################################

RegExp 对象有 3 个方法:test()、exec() 以及 compile()。

test()
test() 方法检索字符串中的指定值。返回值是 true 或 false。


exec()
exec() 方法检索字符串中的指定值。返回值是被找到的值。如果没有发现匹配,则返回 null。


compile()
compile() 方法用于改变 RegExp。
compile() 既可以改变检索模式,也可以添加或删除第二个参数。



##############################################################
支持正则表达式的 String 对象的方法


search() 方法用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串。
语法
stringObject.search(regexp)
参数 描述
regexp
该参数可以是需要在 stringObject 中检索的子串,也可以是需要检索的 RegExp 对象。
注释:要执行忽略大小写的检索,请追加标志 i。
返回值
stringObject 中第一个与 regexp 相匹配的子串的起始位置。
注释:如果没有找到任何匹配的子串,则返回 -1。
说明
search() 方法不执行全局匹配,它将忽略标志 g。它同时忽略 regexp 的 lastIndex 属性,并且总是从字符串的开始
进行检索,这意味着它总是返回 stringObject 的第一个匹配的位置。




match() 方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配。
该方法类似 indexOf() 和 lastIndexOf(),但是它返回指定的值,而不是字符串的位置。
语法
stringObject.match(searchvalue)
stringObject.match(regexp)
参数 描述
searchvalue 必需。规定要检索的字符串值。
regexp 必需。规定要匹配的模式的 RegExp 对象。如果该参数不是 RegExp 对象,则需要首先把它传递给 RegExp 构
造函数,将其转换为 RegExp 对象。
返回值
存放匹配结果的数组。该数组的内容依赖于 regexp 是否具有全局标志 g。
说明
match() 方法将检索字符串 stringObject,以找到一个或多个与 regexp 匹配的文本。这个方法的行为在很大程度上有
赖于 regexp 是否具有标志 g。
如果 regexp 没有标志 g,那么 match() 方法就只能在 stringObject 中执行一次匹配。如果没有找到任何匹配的文本
, match() 将返回 null。否则,它将返回一个数组,其中存放了与它找到的匹配文本有关的信息。该数组的第 0 个元
素存放的是匹配文本,而其余的元素存放的是与正则表达式的子表达式匹配的文本。除了这些常规的数组元素之外,返
回的数组还含有两个对象属性。index 属性声明的是匹配文本的起始字符在 stringObject 中的位置,input 属性声明
的是对 stringObject 的引用。
如果 regexp 具有标志 g,则 match() 方法将执行全局检索,找到 stringObject 中的所有匹配子字符串。若没有找到
任何匹配的子串,则返回 null。如果找到了一个或多个匹配子串,则返回一个数组。不过全局匹配返回的数组的内容与
前者大不相同,它的数组元素中存放的是 stringObject 中所有的匹配子串,而且也没有 index 属性或 input 属性。
注意:在全局检索模式下,match() 即不提供与子表达式匹配的文本的信息,也不声明每个匹配子串的位置。如果您需
要这些全局检索的信息,可以使用 RegExp.exec()。



replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。
语法
stringObject.replace(regexp/substr,replacement)
参数 描述
regexp/substr
必需。规定子字符串或要替换的模式的 RegExp 对象。
请注意,如果该值是一个字符串,则将它作为要检索的直接量文本模式,而不是首先被转换为 RegExp 对象。
replacement 必需。一个字符串值。规定了替换文本或生成替换文本的函数。
返回值
一个新的字符串,是用 replacement 替换了 regexp 的第一次匹配或所有匹配之后得到的。
说明
字符串 stringObject 的 replace() 方法执行的是查找并替换的操作。它将在 stringObject 中查找与 regexp 相匹配的子字符串,然后用 replacement 来替换这些子串。如果 regexp 具有全局标志 g,那么 replace() 方法将替换所有匹配的子串。否则,它只替换第一个匹配子串。
replacement 可以是字符串,也可以是函数。如果它是字符串,那么每个匹配都将由字符串替换。但是 replacement 中的 $ 字符具有特定的含义。如下表所示,它说明从模式匹配得到的字符串将用于替换。
字符 替换文本
$1、$2、...、$99 与 regexp 中的第 1 到第 99 个子表达式相匹配的文本。
$& 与 regexp 相匹配的子串。
$` 位于匹配子串左侧的文本。
$' 位于匹配子串右侧的文本。
$$ 直接量符号。





split() 方法用于把一个字符串分割成字符串数组。
语法
stringObject.split(separator,howmany)
参数 描述
separator 必需。字符串或正则表达式,从该参数指定的地方分割 stringObject。
howmany 可选。该参数可指定返回的数组的最大长度。如果设置了该参数,返回的子串不会多于这个参数指定的数组。如果没有设置该参数,整个字符串都会被分割,不考虑它的长度。
返回值
一个字符串数组。该数组是通过在 separator 指定的边界处将字符串 stringObject 分割成子串创建的。返回的数组中的字串不包括 separator 自身。
但是,如果 separator 是包含子表达式的正则表达式,那么返回的数组中包括与这些子表达式匹配的字串(但不包括与整个正则表达式匹配的文本)。
提示和注释
注释:如果把空字符串 ("") 用作 separator,那么 stringObject 中的每个字符之间都会被分割。
注释:String.split() 执行的操作与 Array.join 执行的操作是相反的。




  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值