正則表達式

          

       前言


       我们在本地计算机中搜索文件时。常常会用“ * ”和“ ? ”来取代随意长度的字符和随意单个的字符;在搜索引擎中用" | "来取代或者的关系,双引號“”之间表示必须包括整段keyword等等。

        


      再来看一个SQL语句:select * from T_Employee where eName like '胡%',即查询全部姓“胡”的员工,运行结果例如以下:


        

  

       这些都涉及到了字符匹配的问题。


       正則表達式是什么 ?


       和上面的“*”、“?” 等符号相似,正則表達式也是用来描写叙述符合某些规则的字符串格式的工具。尽管ASP.NET、JQuery等提供了验证控件,只是正則表達式制定的规范更加复杂也更加严谨,通经常使用来匹配、处理字符串。

       比方:

       规定注冊的username长度为6到18位,仅仅能由下划线、数字和字母组成。正則表達式为: /^[a-z0-9_-]{6,18}$/

       规定真实姓名必须为中文。正則表達式为:/^[\u4e00-\u9fa5]+$/

       规定输入必须为正确的邮箱格式,正則表達式为:/^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/

       ……

       这些对字符串的“约束”。都能够用正則表達式来描写叙述。       


       看到这里您肯定会认为眼花缭乱,对正則表達式产生反感,不要怕。老师常说,记是记不住的,所以我们仅仅须要在须要用到的时候能找到即可,我想肯定没有人去花那么多功夫去背这些东西。

当然,了解一些出现频率较高的元字符(正則表達式中的元素)能够帮助我们较快地“读懂”那些正則表達式。


经常使用的元字符及其含义:

元字符    描写叙述
\ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。

比如。“n”匹配字符“n”。

“\n”匹配一个换行符。序列“\\”匹配“\”而“\(”则匹配“(”。

^ 匹配输入字符串的開始位置。假设设置了RegExp对象的Multiline属性,^也匹配“\n”或“\r”之后的位置。
$ 匹配输入字符串的结束位置。假设设置了RegExp对象的Multiline属性,$也匹配“\n”或“\r”之前的位置。
* 匹配前面的子表达式零次或多次。比如。zo*能匹配“z”以及“zoo”。*等价于{0,}。
+ 匹配前面的子表达式一次或多次。

比如,“zo+”能匹配“zo”以及“zoo”。但不能匹配“z”。

+等价于{1,}。

? 匹配前面的子表达式零次或一次。

比如。“do(es)?”能够匹配“do”或“does”中的“do”。

?等价于{0,1}。

{n} n是一个非负整数。

匹配确定的n次。比如,“o{2}”不能匹配“Bob”中的“o”,可是能匹配“food”中的两个o。

{n,} n是一个非负整数。至少匹配n次。

比如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的全部o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o*”。

{n,m} m和n均为非负整数。当中n<=m。最少匹配n次且最多匹配m次。比如,“o{1,3}”将匹配“fooooood”中的前三个o。

“o{0,1}”等价于“o?”。

请注意在逗号和两个数之间不能有空格。

. 匹配除“\n”之外的不论什么单个字符。要匹配包含“\n”在内的不论什么字符,请使用像“[.\n]”的模式。

x|y 匹配x或y。

比如,“z|food”能匹配“z”或“food”。

“(z|f)ood”则匹配“zood”或“food”。

[xyz] 字符集合。匹配所包括的随意一个字符。

比如,“[abc]”能够匹配“plain”中的“a”。

[^xyz] 负值字符集合。匹配未包括的随意字符。比如。“[^abc]”能够匹配“plain”中的“p”。

[a-z] 字符范围。匹配指定范围内的随意字符。比如,“[a-z]”能够匹配“a”到“z”范围内的随意小写字母字符。
[^a-z] 负值字符范围。

匹配不论什么不在指定范围内的随意字符。比如。“[^a-z]”能够匹配不论什么不在“a”到“z”范围内的随意字符。

\w 匹配包含下划线的不论什么单词字符。等价于“[A-Za-z0-9_]”。
\W 匹配不论什么非单词字符。

等价于“[^A-Za-z0-9_]”。

\s 匹配不论什么空白字符。包含空格、制表符、换页符等等。

等价于[\f\n\r\t\v]。

\S 匹配不论什么非空白字符。

等价于[^\f\n\r\t\v]。

\d 匹配一个数字字符。等价于[0-9]。

\D 匹配一个非数字字符。

等价于[^0-9]。


这里仅仅记录几个经常使用的现成的正則表達式(普通情况做个验证应该够用了)。注意:千万不要记。用的时候再来找即可了!

username(6~18位数字、字母、下划线组成) /^[a-z0-9_-]{6,18}$/
password(6~18位数字、字母、下划线组成) /^[a-z0-9_-]{6,18}$/
password2 (?

=^.{8,}$)(?

=.*\d)(?

=.*\W+)(?=.*[A-Z])(?=.*[a-z])(?

!.*\n).*$ (由数字/大写字母/小写字母/标点符号组成,四种都必有,8位以上)

十六进制值 /^#?([a-f0-9]{6}|[a-f0-9]{3})$/
邮箱 /^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/
/^[a-z\d]+(\.[a-z\d]+)*@([\da-z](-[\da-z])?)+(\.{1,2}[a-z]+)+$/或\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
网址(URL) /^(https?:\/\/)?

([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?

$/ 或 [a-zA-z]+://[^\s]*

IP地址 /((2[0-4]\d|25[0-5]|[01]?

\d\d?

)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)/
/^(?

:(?: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]?)$/ 或 ((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)

HTML 标签 /^<([a-z]+)([^<]+)*(?

:>(.*)<\/\1>|\s+\/>)$/或<(.*)(.*)>.*<\/\1>|<(.*) \/>

删除代码\\凝视 (?<!http:|\S)//.*$
匹配双字节字符(包含汉字在内) [^\x00-\xff]
汉字(字符) [\u4e00-\u9fa5]
Unicode编码中的汉字范围 /^[\u2E80-\u9FFF]+$/
中文及全角标点符号(字符) [\u3000-\u301e\ufe10-\ufe19\ufe30-\ufe44\ufe50-\ufe6b\uff01-\uffee]
日期(年-月-日) (\d{4}|\d{2})-((0?

([1-9]))|(1[1|2]))-((0?[1-9])|([12]([1-9]))|(3[0|1]))

日期(月/日/年) ((0?[1-9]{1})|(1[1|2]))/(0?[1-9]|([12][1-9])|(3[0|1]))/(\d{4}|\d{2})
时间(小时:分钟, 24小时制) ((1|0?)[0-9]|2[0-3]):([0-5][0-9])
中国大陆固定电话号码 (\d{4}-|\d{3}-)?(\d{8}|\d{7})
中国大陆手机号码 1\d{10}
中国大陆邮政编码 [1-9]\d{5}
中国大陆身份证号(15位或18位) \d{15}(\d\d[0-9xX])?
非负整数(正整数或零) \d+
正整数 [0-9]*[1-9][0-9]*
负整数 -[0-9]*[1-9][0-9]*
整数 -?\d+
小数 (-?\d+)(\.\d+)?

空白行 \n\s*\r 或者 \n\n(editplus) 或者 ^[\s\S ]*\n 
QQ号码 [1-9]\d{4,}
不包括abc的单词 \b((?

!abc)\w)+\b

匹配首尾空白字符 ^\s*|\s*$


       怎样应用正則表達式 ?

 

       对正則表達式有所了解之后。该怎样在我们的程序中应用?全部环境下都能应用正則表達式吗?

       搜索时会发现,在相关搜索中会出现JS正則表達式、PHP正則表達式、Python正則表達式等等,由此看出。正則表達式的应用还是非常广的,不论什么语言环境都“认识”它。

     

       只是,在每种语言环境下,对正則表達式的应用都是有所差异的(毕竟每种环境调用的底层函数都不一样)。比方我们.NET中经常使用Regex和Match等类来应用表达式,在JS中能够直接用String对象的test、match等方法应用,在Java中经常使用Pattern类和Matcher类来应用。


       这里仅仅列举在怎样.NET和JS中使用正則表達式。其它的有兴趣能够问度娘。


       在.NET中使用正則表達式:

       简单画个窗口:

        

       引用System.Text.RegularExpressions命名空间。关于此命名空间可点击链接參考MSDN,在此暂不说明,仅仅是举例说明用Regex类的IsMatch方法验证输入的字符串是否合法。

//验证数字
        private void btnIsNumber_Click(object sender, EventArgs e)
        {
            string valEx = @"^\d+$";      //定义验证数字的正則表達式规则
            
            if (!Regex.IsMatch(txtValidate.Text.Trim(),valEx))
            {
                MessageBox.Show("您输入的不是数字!

"); } else { MessageBox.Show("您输入的是数字!

"); } } //验证手机号 private void btnIsPhoneNum_Click(object sender, EventArgs e) { string valEx = @"^\d{11}$"; //定义验证数字的正則表達式规则,规定输入11为数字有效 if (!Regex.IsMatch(txtValidate.Text.Trim(), valEx)) { MessageBox.Show("您输入的不是手机号!

"); } else { MessageBox.Show("您输入的是手机号!

"); } } //验证中文 private void btnIsChinese_Click(object sender, EventArgs e) { string valEx = @"^[\u4e00-\u9fa5]+$"; //定义验证中文的正則表達式规则 if (!Regex.IsMatch(txtValidate.Text.Trim(), valEx)) { MessageBox.Show("您输入的不是中文!"); } else { MessageBox.Show("您输入的是中文!

"); } } //验证邮箱格式 private void btnIsEmail_Click(object sender, EventArgs e) { string valEx = @"^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$"; //定义验证邮箱格式的正則表達式规则 if (!Regex.IsMatch(txtValidate.Text.Trim(), valEx)) { MessageBox.Show("您输入的不是邮箱!"); } else { MessageBox.Show("您输入的是邮箱。"); } }

         点击【查看效果
          

      在JS中应用正則表達式

      JS文件代码:  

<script language="javascript" type="text/javascript">
	function IsNumber()
	{
	    //验证数字
		var strValidate=document.getElementById("txtValidate").value;
		var strIsNumber=/^\d+$/;  
		var b=strIsNumber.test(strValidate);
		if(b)
		{
		alert("字符串 "+strValidate+" 是数字");
		}else
		{
		alert("字符串 "+strValidate+" 不是数字");
		}
	}
	function IsPhoneNum()
	{
	    //验证手机号
		var strValidate=document.getElementById("txtValidate").value;		 
		var strIsPhoneNum=/^\d{11}$/;                                      
		var b=strIsPhoneNum.test(strValidate);
		if(b)
		{
		alert("字符串 "+strValidate+" 是手机号");
		}else
		{
		alert("字符串 "+strValidate+" 不是手机号");
		}
	}
	function IsChinese()
	{
	    //验证中文  
		var strValidate=document.getElementById("txtValidate").value;		 
		var strIsChinese=/^[\u4e00-\u9fa5]+$/;                                                           
		var b=strIsChinese.test(strValidate);
		if(b)
		{
		alert("字符串 "+strValidate+" 是中文");
		}else
		{
		alert("字符串 "+strValidate+" 不是中文");
		}
	}
	function IsEmail()
	{
	    //验证邮箱 
		var strValidate=document.getElementById("txtValidate").value;		 
		var strIsEmail=/^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/;                                                           
		var b=strIsEmail.test(strValidate);
		if(b)
		{
		alert("字符串 "+strValidate+" 是邮箱");
		}else
		{
		alert("字符串 "+strValidate+" 不是邮箱");
		}
	}
</script>
        HTML代码:     

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Test</title>
</head>
<script type="text/javascript" src="test.js"></script>
<body>
<form name="form1" id="form1" action="" method="post">
     <p align="center">
     <input name="" id="txtValidate" type="text"/>
     </p>
     <p align="center">  
     <input name="" type="button" value="验证数字" onclick="javascript:IsNumber()" />
     <input name="" type="button" value="验证手机号" onclick="javascript:IsPhoneNum()"/>
     <input name="" type="button" value="验证中文" onclick="javascript:IsChinese()"/><span style="font-family: Arial, Helvetica, sans-serif;">   </span>
     <input name="" type="button" value="验证邮箱" onclick="javascript:IsEmail()"/>
     </p>
</form>
</body>
</html>

       点击【查看效果




posted @ 2017-05-24 16:02  zsychanpin  阅读(474)  评论(0编辑  收藏  举报