我正在使用^[\w-\.\+]+@([\w-]+\.)+[\w-]{2,4}$
验证电子邮件地址,当我从.aspx.cs使用它时,它可以正常验证IDN电子邮件,但是当我直接从aspx页面使用它时,它无效。
return Regex.IsMatch(
email,
@"^[\w-\.\+]+@([\w-]+\.)+[\w-]{2,4}$",
RegexOptions.Singleline);
我想要验证的ID类似于pelai@ÖßÜÄÖ.com
我对正则表达式太苛刻你们知道我做错了什么吗?
答案 0 :(得分:3)
你可能想看看regexlib.com,他们有很多精选的用户创建的内容来做这些非常普通的比赛类型。
答案 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)
元字符匹配换行符,但正则表达式中唯一的点是匹配的字符点。