版权声明:本文为博主原创文章,未经博主允许不得转载。 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>
点击【查看效果】