前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >正则表达式

正则表达式

作者头像
DannyHoo
发布2018-09-13 11:34:49
1.5K0
发布2018-09-13 11:34:49
举报

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://cloud.tencent.com/developer/article/1336929

前言

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

      再来看一个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?)+(.{1,2}a-z+)+$/或\w+(-+.\w+)*@\w+(-.\w+)*.\w+(-.\w+)*

网址(URL)

/^(https?:\/\/)?(\da-z.-+).(a-z.{2,6})(\/\w .-*)*\/?$/ 或 a-zA-z+://^\s*

IP地址

/((20-4\d|250-5|01?\d\d?).){3}(20-4\d|250-5|01?\d\d?)/ /^(?:(?:250-5|20-4|01?0-9?).){3}(?:250-5|20-4|01?0-9?)$/ 或 ((20-4\d|250-5|01?\d\d?).){3}(20-4\d|250-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))|(11|2))-((0?1-9)|(12)|(30|1))

日期(月/日/年)

((0?1-9{1})|(11|2))/(0?1-9|(12)|(30|1))/(\d{4}|\d{2})

时间(小时:分钟, 24小时制)

((1|0?)0-9|20-3):(0-5)

中国大陆固定电话号码

(\d{4}-|\d{3}-)?(\d{8}|\d{7})

中国大陆手机号码

1\d{10}

中国大陆邮政编码

1-9\d{5}

中国大陆身份证号(15位或18位)

\d{15}(\d\d0-9xX)?

非负整数(正整数或零)

\d+

正整数

0-9*1-9*

负整数

-0-9*1-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(http://msdn.microsoft.com/zh-cn/library/System.Text.RegularExpressions(v=vs.110%29.aspx)命名空间,关于此命名空间可点击链接参考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>

       点击【查看效果

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2014年10月08日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言:
  • 正则表达式是什么 ?
  • 如何应用正则表达式 ?
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档