正则表达式

来源:互联网 发布:网络犯罪的概念和特征 编辑:程序博客网 时间:2024/05/19 19:42

          

       前言


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

        


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


        

  

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


       正则表达式是什么 ?


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

       比如:

       规定注册的用户名长度为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]。


这里只记录几个常用的现成的正则表达式(一般情况做个验证应该够用了),注意:千万不要记!用的时候再来找就行了!

用户名(6~18位数字、字母、下划线组成)/^[a-z0-9_-]{6,18}$/密码(6~18位数字、字母、下划线组成)/^[a-z0-9_-]{6,18}$/密码2(?=^.{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>

       点击【查看效果】




原创粉丝点击