加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式

发布时间:2020-12-13 22:52:27 所属栏目:百科 来源:网络整理
导读:前言 : 我们在本地计算机中搜索文件时,经常会用“ * ”和“ ? ”来代替任意长度的字符和任意单个的字符;在搜索引擎中用" | "来代替或者的关系,双引号“”之间表示必须包含整段关键字等等。 再来看一个SQL语句:select * from T_Employee where eName lik

前言


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


再来看一个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 匹配任何空白字符,包括空格、制表符、换页符等等。等价于[fnrtv]。
S 匹配任何非空白字符。等价于[^fnrtv]。
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-zd]+(.[a-zd]+)*@([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]?dd?).){3}(2[0-4]d|25[0-5]|[01]?dd?)/
/^(?:(?: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]?dd?).){3}(2[0-4]d|25[0-5]|[01]?dd?)
HTML 标签 /^<([a-z]+)([^<]+)*(?:>(.*)</1>|s+/>)$/或<(.*)(.*)>.*</1>|<(.*) />
删除代码注释 (?<!http:|S)//.*$
匹配双字节字符(包括汉字在内) [^x00-xff]
汉字(字符) [u4e00-u9fa5]
Unicode编码中的汉字范围 /^[u2E80-u9FFF]+$/
中文及全角标点符号(字符) [u3000-u301eufe10-ufe19ufe30-ufe44ufe50-ufe6buff01-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})
中国大陆手机号码 1d{10}
中国大陆邮政编码 [1-9]d{5}
中国大陆身份证号(15位或18位) d{15}(dd[0-9xX])?
非负整数(正整数或零) d+
正整数 [0-9]*[1-9][0-9]*
负整数 -[0-9]*[1-9][0-9]*
整数 -?d+
小数 (-?d+)(.d+)?
空白行 ns*r 或者 nn(editplus) 或者 ^[sS ]*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>

点击【查看效果】

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读