您的位置:首页 - .NET
走进.net正则表示式的世界
现在在网上注册账号,很多都需要提供电子邮箱,有时如果填写错误的话,就无法提交注册。有的留言板,如果输入格式错误的邮箱地址,也是无法提交留言的。比如KeleyiCMS的留言功能,当提交留言时,把Email填写为:@keleyi.com ,那么会给出邮箱格式错误的提示。如下图:


那么上面这个Email有什么问题呢?很明显,“@”的前面没有字符,这是不行的。
email地址一定要有的字符:“@”,@的后面接域名,前面是邮箱用户名,用户名最少一个字符,只能由数字、字母、下划线(_)、横杆(-)或点(.)组成,所以刚才的输入,没有用户,格式错误。

那么网站是怎么知道邮箱格式错误的呢?当然是用程序检测了,如果没有接触过正则表达式的话,很可能一个一个条件判断,只要不符合其中一个要求,就是格式错误。检测邮箱地址的程序可以是运行在客户端浏览器上的Javascript,也可以是运行在服务器端的C#。这里介绍C#的程序。这不,陈武适老师就布置了一个作业:使用Visual Studio 2010创建一个Windows窗体应用程序来体验邮箱地址的验证。

这个苗达庄会啊,WinForm项目又不是没做过,于是...

打开Visual Studio 2010,点击“文件”菜单,然后选择“新建”-》“项目”


在弹出的“新建项目”对话框中,选择“Visual C#”的“Windows”下的“Windows窗体应用程序”,输入项目名称“KeleyiRegexWorld”,选择合适的位置,点击“确定”按钮,就建立了一个Windows窗体应用程序,就是通常所说的WinForm项目。


然后右键点击窗体“Form1”,选择“重命名”,将窗体改名为“RegexForm”,弹出对话框:“即将重命名文件。是否也对此项目中对代码元素“Form1”的所有引用执行重命名操作?”,选择“是”。

然后在窗体上添加2个Label和2个TextBox控件,一个Button控件,效果如下:


其中上面的TextBox控件的(Name)属性改为:textBox_input
下面的TextBox则改为:textBox_result,
Button控件的则改为:button_ok
双击Button控件,转到方法:
private void button_ok_Click(object sender, EventArgs e)
{

}
在这个方法中,可以加入代码验证输入的邮箱地址格式。

在这里我们假设邮箱地址的规则如下:
1.必须包含且只有一个“@”字符,“@”的前面是用户名,后面是域名。
2.用户名至少一个字符,最多64个字符,而且只能由数字、字母、下划线(_)、横杆(-)或点(.)组成。
3.@后面的域名最多255个字符。

那么,邮箱地址要怎么验证呢,点击按钮的代码要怎么写呢?苗达庄正在思考,这时走来了一个人,胸前印着一个大S,苗达庄一想,难道是Super Man,超人?于是笑脸相迎:“小弟苗达庄,请问大侠怎么称呼?”“苗兄你好,我是史俊。”“史大侠您好啊,听说史大侠有超人的能力,不知能否帮小弟个忙,给个验证邮箱地址的代码?”“超人不敢担,不过验证邮箱地址的还能帮上忙”

史俊看了苗达庄的项目,写给苗达庄如下代码。


现在创建一个KeleyiCheck类,代码如下:

using System.Text;
namespace Keleyi.Com.Tool
{
class KeleyiCheck
{
/// <summary>
/// 检查邮箱地址格式
/// </summary>
/// <param name="email"></param>
/// <returns>返回空字符串则为未发现格式错误,否则返回格式错误具体信息</returns>
public static string CheckEmail(string email)
{
if (string.IsNullOrWhiteSpace(email))
return "邮箱地址不能为空";

email = email.Trim();

if (SubstringCount(email, "@") != 1)
return "邮箱地址必须包含且只包含一个“@”字符";

string m_username = email.Split('@')[0];

string m_temp = CheckUsername(m_username);
if (m_temp != string.Empty)
return m_temp;

string m_domain = email.Split('@')[1];
return CheckDomain(m_domain);
}

/// <summary>
/// 验证用户名
/// </summary>
/// <param name="username"></param>
/// <returns></returns>
private static string CheckUsername(string username)
{
if (username.Length < 1 || username.Length > 64)
return "用户名至少一个字符,最多64个字符";

string m_charString = "0123456789abcdefghijklmnopqrstuvwxyz.-_";

if (CheckCharInString(m_charString, username.ToLower()))
return string.Empty;
else
return "用户名只能由英文字母,数字,下划线和横杆组成";
}

static bool CheckCharInString(string charString,string input)
{
StringBuilder m_input = new StringBuilder(input);
foreach (char c in charString)
{
m_input.Replace(c.ToString(),"");
}
if (m_input.ToString() == string.Empty)
return true;
return false;
}

/// <summary>
/// 验证域名,暂未实现
/// </summary>
/// <param name="domain"></param>
/// <returns></returns>
private static string CheckDomain(string domain)
{
return string.Empty;
}

/// <summary>
/// 计算字符串中子串出现的次数
/// </summary>
/// <param name="str">字符串</param>
/// <param name="substring">子串</param>
/// <returns>出现的次数</returns>
static int SubstringCount(string str, string substring)
{
if (str.Contains(substring))
{
string strReplaced = str.Replace(substring, "");
return (str.Length - strReplaced.Length);
}

return 0;
}
}
}


按钮点击代码如下:
private void button_ok_Click(object sender, EventArgs e)
{
textBox_result.Text = Keleyi.Com.Tool.KeleyiCheck.CheckEmail(textBox_input.Text);
if (textBox_result.Text == string.Empty)
textBox_result.Text = "未发现邮箱地址格式错误";
}

苗达庄谢过史俊,把项目交给陈武适老师。陈老师看过之后说:“看得出达庄同学是很用心的,这一点值得表扬。”苗达庄笑容满面。“但是,”陈老师继续说:“这个不是最好的方法,也不是我让你们做这个项目的目的。你试试使用正则表达式再做一次吧。还有,下次要认真听课。”苗达庄笑容渐渐消失:“还要做啊,好的。”然后就去找史俊,说:“史先生,看来你得把你胸前的S去掉,免得别人认为你是超人。”史俊说:“我没说我是超人啊,我的这个S是我中文名和英文名的第一个字母而已。”达庄:“你的英文名是什么?”史俊:“String”达庄:“我就说嘛原来不是超人,难怪你给的那个验证邮箱地址的代码不好,哼!”

史俊不辞而别,心想:“看来还是要找柯乐义啊”于是拿起手机拨打电话:“老柯啊,想死我了,你就是我白天的太阳,晚上的月亮,没有你我的世界一片黑暗。你什么时候回来?”柯乐义:“本来很快就回去了,听你这么说我看还是不回去了,免得被误会。说吧有什么事?”“看来还是老柯你了解我,要怎样使用正则表达式验证邮箱地址呢?”柯乐义:“这个容易,只要一小段代码就行了。这样吧,你找郑泽吧,他最在行了。”“哪个郑泽啊”“就是住在System.Text.RegularExpressions的那个,他的英文名是Regex”“我跟他又不熟,还是你给些代码吧。”“我现在没空,你找他就行了,不难的。”

苗达庄在命名空间System.Text.RegularExpressions下找到了郑泽,请他帮忙,郑泽说:“验证邮箱地址这事你找我是找对人了,我是最正直的啦,什么邮箱地址、电话号码等等,来我这里检测,合格就合格,不合格就不合格。不过呢,你的项目需要小小的修改。”

苗达庄按照郑泽的要求,给RegexForm添加了一个Button控件,(Name)属性改为button_regexCheck,然后,郑泽给苗达庄以下代码:

在类中添加了以下方法:
public static bool RegexCheckEmail(string email)
{
return Regex.IsMatch(email, @"^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$");
}

按钮button_regexCheck的点击事件方法:
private void button_regexCheck_Click(object sender, EventArgs e)
{
if (Keleyi.Com.Tool.KeleyiCheck.RegexCheckEmail(textBox_input.Text.Trim()))
textBox_result.Text = "邮箱地址格式 正确";
else
textBox_result.Text = "邮箱地址格式 错误";
}


Regex.IsMatch 方法 (String, String)
指示所指定的正则表达式在指定的输入字符串中是否找到了匹配项。

语法:
public static bool IsMatch(
string input,
string pattern
)

参数
input
类型:System.String
要搜索匹配项的字符串。
pattern
类型:System.String
要匹配的正则表达式模式。
返回值
类型:System.Boolean
如果正则表达式找到匹配项,则为 true;否则,为 false。


异常和条件
ArgumentException 出现正则表达式分析错误。
ArgumentNullException input 或 pattern 为 null。


IsMatch 方法通常用于验证字符串,或者在不检索字符串的情况下确保该字符串符合特定模式以进行后续操作。 若要确定一个或多个字符串是否匹配某个正则表达式模式并检索这些字符串以进行后续操作,请调用 Match 或 Matches 方法。
静态 IsMatch(String, String) 方法等效于使用 pattern 指定的正则表达式模式构造 Regex 对象并调用 IsMatch(String) 实例方法。 此正则表达式模式将被缓存以供正则表达式引擎快速检索。
pattern 参数由通过符号描述要匹配的字符串的各种正则表达式语言元素组成。
本站导航
相关文章
柯乐义 Copyright© keleyi.com