原文链接:http://www.jb51.cc/article/p-pzejexoe-bac.html
一直觉得正则表达式是很Geek的东西,一直浸淫在Windows的环境下,让我很难接触到这个伟大的发明,最近用C#做的项目里面要处理字符串,发现C#支持正则表达式,故而熟悉了一下,发现真是相见恨晚,处理效果真是太棒了,感觉这个技能一定要Get,故而催生出这篇博文。
基本概念
记住正则语法最好的办法就是记住这三样东西:Bracket(括号),caret(插入符号)和Dollars(美元符号)。
B | C | D |
---|---|---|
在正则表达式中有3种类型的括号方括号 [ 和花括号 { 。方括号 [ 内是需要匹配的字符,花括号 { 内是指定匹配字符的数量。圆括号 ( 则是用来分组的。 | 插入符号 ^ 表示正则式的开始。 | 美元符号 $ 表示正则式的结束。 |
现在你知道上面的3个语法后,你就可以写世界上任何一条验证规则了。比如下面的例子就很好的说明了上面3条正则语法是如何协调运作的。
具体实例
Regex代码 | 说明 | 匹配字符串 |
---|---|---|
^my | 表示所有以 @H_403_70@my 开头的字符串 | @H_403_70@my pen,@H_403_70@myDestine等 |
to win$ | 表示所有以 @H_403_70@to win 结尾的字符串 | @H_403_70@I want to win 等 |
^abc$ | 表示开头结尾都是 @H_403_70@abc 的字符串 | 只有 @H_403_70@abc 这一种情况 |
me | 表示任何包含 @H_403_70@me 的字符串 | @H_403_70@meme,@H_403_70@It's me,等 |
“*,+,?”的用法
* , + 和 ? 这三个符号,表示一个或一序列字符重复出现的次数。它们分别表示:
下面是几个例子:
Regex代码 | 说明 | 匹配字符串 |
---|---|---|
ab* | 表示一个字符串有一个a后面跟着0个或若干个b | @H_403_70@a,@H_403_70@ab,@H_403_70@abb 等 |
ab+ | 表示一个字符串有一个a后面跟着至少一个b或者更多 | @H_403_70@ab,@H_403_70@abb 等 |
ab? | 表示一个字符串有一个a后面跟着0个或者一个b | @H_403_70@a,@H_403_70@aaa,@H_403_70@ab``abs 等 |
a?b+$ | 表示在字符串的末尾有0个或一个a跟着一个或几个b | @H_403_70@ab,@H_403_70@b,@H_403_70@abb 等 |
“{}”的用法
也可以使用范围,用大括号括起,用以表示重复次数的范围
Regex代码 | 说明 | 匹配字符串 |
---|---|---|
ab{2} | 表示一个字符串有一个a跟着2个b | @H_403_70@abb,@H_403_70@sabbbbbb,@H_403_70@sabbsegf 等 |
ab{2,} | 表示一个字符串有一个a后面跟着至少2个b或者更多 | @H_403_70@abb,@H_403_70@abbbbb 等 |
ab{3,5} | 表示一个字符串有一个a跟着3到5个b |
请注意,你必须指定范围的下限(如:{0,2}而不是{,2})。 @H_520_301@ 还有,你可能注意到了,@H_403_70@*,@H_403_70@+和 @H_403_70@? 相当于{0,},{1,} 和 {0,1}。
“|”的用法
还有一个 | ,表示 或操作。
Regex代码 | 说明 | 匹配字符串 |
---|---|---|
hi|hello | 表示一个字符串里有 hi 或者 hello | |
(b|cd)ef | 表示一个字符串里有 bef 或 cdef | |
(a|b)*c | 表示一串a 或 b混合的字符串后面跟一个c | @H_403_70@c,@H_403_70@ac,@H_403_70@bc,@H_403_70@aaac 等 |
“.”的用法
. 可以替代任何字符。
Regex代码 | 说明 | 匹配字符串 |
---|---|---|
a.[0-9] | 表示一个字符串有一个 a 后面跟着一个任意字符和一个数字 | @H_403_70@ax9,@H_403_70@a*0 等 |
^.{3}$ | 表示有任意三个字符的字符串(长度为3个字符) | @H_403_70@123,@H_403_70@abc 等 |
“[]”的用法
方括号 [] 表示某些字符允许在一个字符串中的某一特定位置出现。
Regex代码 | 说明 | 匹配字符串 |
---|---|---|
[ab] | 表示一个字符串有一个 @H_403_70@a 或 @H_403_70@b(相当于 @H_403_70@a|b) | @H_403_70@ass,@H_403_70@bkk 等 |
[a-d] | 表示一个字符串包含小写的 @H_403_70@a 到 @H_403_70@d 中的一个(相当于 @H_403_70@a¦b¦c¦d 或者 @H_403_70@[abcd]) | |
^[a-zA-Z] | 表示一个以字母开头的字符串 | |
[0-9]% | 表示一个百分号前有一位的数字 | |
,[a-zA-Z0-9]$ | 表示一个字符串以一个逗号后面跟着一个字母或数字结束 |
还可以在方括号里用 ^ 表示不希望出现的字符,^ 应在方括号里的第一位。
Regex代码 | 说明 | 匹配字符串 |
---|---|---|
%[^a-zA-Z]% | 表示两个百分号中不应该出现字母 | @H_403_70@%1%,@H_403_70@b%2%a 等 |
为了逐字表达,你必须在^,.,$,(),|,*,+,?,{,\ 这些字符前加上转移字符:\ 。
请注意在方括号中,不需要转义字符。
快捷命令
可以用以下的快捷命令来简化你的正则表达式
实际命令 | 快捷命令 |
---|---|
[0-9] | \d |
[a-z][0-9][_] | \w |
0次或多次发生 | * |
至少一次发生 | + |
0次或1次发生 | ? |
示例
Regex代码 | 说明 | 匹配字符串 |
---|---|---|
@H_403_70@^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$ | 校验普通电话、传真号码:可以“+”或数字开头,可含有“-” 和 “ ” | +123 -999 999 ; +123-999 999 ;123 999 999 ;+123 999999 等 |
@H_403_70@^(\w){6,20}$ | 校验密码:只能输入6-20个字母、数字、下划线 | |
@H_403_70@^http[s]{0,1}:\/\/.+$ | 校验URL | \/ :表示字符“/”;. 表示所有字符的集;+ 等同于{1,},就是1到正无穷吧 |
@H_403_70@^http[s]{0,1}:\/\/.{1,n}$ | 表示url串的长度为length(“https://”) + n | |
@H_403_70@^[\u4E00-\u9FA5]+$ | 校验纯中文字符 | |
@H_403_70@^\d+$ | 非负整数(正整数 + 0) | |
@H_403_70@^[0-9]*[1-9][0-9]*$ | 正整数 | |
@H_403_70@^((-\d+)|(0+))$ | 非正整数(负整数 + 0) | |
@H_403_70@^-[0-9]*[1-9][0-9]*$ | 负整数 | |
@H_403_70@^-?\d+$ | 整数 | |
@H_403_70@^\d+(\.\d+)?$ | 非负浮点数(正浮点数 + 0) | |
@H_403_70@^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$ | 正浮点数 | |
@H_403_70@^((-\d+(\.\d+)?)|(0+(\.0+)?))$ | 非正浮点数(负浮点数 + 0) | |
@H_403_70@^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$ | 负浮点数 | |
@H_403_70@^(-?\d+)(\.\d+)?$ | 浮点数 | |
@H_403_70@^[+-]?\d+(\.\d+)?$ | 浮点数前面可加+或者- | |
@H_403_70@^[A-Za-z]+$ | 由26个英文字母组成的字符串 | |
@H_403_70@^[A-Z]+$ | 由26个英文字母的大写组成的字符串 | |
@H_403_70@^[a-z]+$ | 由26个英文字母的小写组成的字符串 | |
@H_403_70@^[A-Za-z0-9]+$ | 由数字和26个英文字母组成的字符串 | |
@H_403_70@^\w+$ | 由数字、26个英文字母或者下划线组成的字符串 | |
@H_403_70@^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$ | email地址 | |
@H_403_70@^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$ | url | |
@H_403_70@^(\d{2}|\d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$ | 年-月-日 | |
@H_403_70@^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(\d{2}|\d{4})$ | 月/日/年 | |
@H_403_70@^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$ | Emil | |
@H_403_70@^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5]).(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$ | IP地址 | |
@H_403_70@^([0-9A-F]{2})(-[0-9A-F]{2}){5}$ | MAC地址的正则表达式 | |
@H_403_70@^[-+]?\d+(\.\d+)?$ | 值类型正则表达式 |
C#测试程序
主要是要使用 @H_403_70@Regex 这个类,它的命名空间是 @H_403_70@System.Text.RegularExpressions。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Text.RegularExpressions;
namespace RegexTester
{
public partial class FormRegex : Form
{
public FormRegex()
{
InitializeComponent();
}
private void btn_Test_Click(object sender,EventArgs e)
{
setControl();
}
private void t_Regex_TextChanged(object sender,EventArgs e)
{
setControl();
}
private void t_Test_TextChanged(object sender,EventArgs e)
{
setControl();
}
#region Local Function
public void setControl()
{
string str = t_Test.Text;
string strReg = t_Regex.Text;
if (("" == str)||("" == strReg))
{
lab_show.Text = "Match or Not";
lab_show.ForeColor = Color.Black;
lab_show.TextAlign = ContentAlignment.MiddleCenter;
return;
}
if (isMatchReg(str,strReg))
{
lab_show.Text = "√ Match";
lab_show.ForeColor = Color.LawnGreen;
lab_show.TextAlign = ContentAlignment.MiddleCenter;
}
else
{
lab_show.Text = "× Not Match";
lab_show.ForeColor = Color.Red;
lab_show.TextAlign = ContentAlignment.MiddleCenter;
}
}
public static bool isMatchReg(string str,string regStr)
{
//判断
return Regex.IsMatch(str,regStr);
}
#endregion
private void FormRegex_KeyDown(object sender,KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)//如果输入的是回车键
{
setControl();
}
}
}
}