正則表達式
前言:
我们在本地计算机中搜索文件时。常常会用“ * ”和“ ? ”来取代随意长度的字符和随意单个的字符;在搜索引擎中用" | "来取代或者的关系,双引號“”之间表示必须包括整段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>
点击【查看效果】