这个正则表达式有什么问题

时间:2010-06-28 15:02:09

标签: asp.net regex

我正在使用^[\w-\.\+]+@([\w-]+\.)+[\w-]{2,4}$验证电子邮件地址,当我从.aspx.cs使用它时,它可以正常验证IDN电子邮件,但是当我直接从aspx页面使用它时,它无效。

return  Regex.IsMatch(
                email,
                @"^[\w-\.\+]+@([\w-]+\.)+[\w-]{2,4}$",
                RegexOptions.Singleline);

我想要验证的ID类似于pelai@ÖßÜÄÖ.com

我对正则表达式太苛刻你们知道我做错了什么吗?

5 个答案:

答案 0 :(得分:3)

你可能想看看regexlib.com,他们有很多精选的用户创建的内容来做这些非常普通的比赛类型。

http://regexlib.com/Search.aspx?k=email

答案 1 :(得分:2)

首先,正确验证电子邮件地址比正则表达式更复杂。但除此之外,正则表达式没有错,但可能更像是你如何使用它。

编辑(看到你的代码之后):你确定要测试的字符串没有空白等吗?在那里放一个断点并检查字符串,这可能会让你知道出了什么问题。

答案 2 :(得分:1)

你应该在第一个char类中转义破折号( - ),不需要dot和plus:

[\w\-.+]

[\w.+-]

如果它是最后一个字符,则无需转义破折号。

答案 3 :(得分:0)

使用“直接来自aspx页面”你可能意味着在一个regularrexpression验证器?

然后你需要知道正则表达式是由另一个系统使用的:javascript,它有自己的正则表达式实现。这意味着直接在.Net中工作的正则表达式可能在js中失败。

实现并没有太大的不同,基础是相同的。但是细节上可能存在差异(如未处理 - 如何处理)和js缺少一些“高级功能”(尽管你的正则表达式看起来并不太“先进”;-))。

您是否在浏览器中看到任何错误消息?

答案 4 :(得分:0)

问题是测试地址中的那些非ASCII字符ÖßÜÄÖ(您在@ HansKesting的答案评论中只提到过)。在.NET中,\w匹配所有Unicode字母和数字,甚至除了_之外的几个字符,它们被分类为连接标点符号,但在JavaScript中它只匹配{{1} }。

JavaScript也缺乏对Unicode属性(如[A-Za-z0-9_]表示字母)和块(\p{L})的支持,因此您必须列出要通过其Unicode转义允许的任何非ASCII字符( \p{IsLatin})。如果您只想支持Latin1字母,我想您可以使用\uXXXX,但IDN应该支持的不仅仅是Latin1,不是吗?

顺便说一句,JavaScript也不支持单行模式,即使它确实你也无法使用它。 JS确实支持Multiline和IgnoreCase模式,但无法在服务器端和客户端设置它们。内联修饰符[\w\u00C0-\u00FF](?i)在JS中不起作用,RegexOptions参数仅适用于服务器端。

幸运的是,你真的不需要单行模式;它允许(?m)元字符匹配换行符,但正则表达式中唯一的点是匹配的字符点。