**CONTEXT:**我有一个电子邮件正则表达式,在jquery中使用,同时注册用户如下。在我开始项目之前,它已经存在于数据库中,我假设它是正确的:
/^(?!.*\.{2})[A-Z0-9_%][\w\.\+\-]*[a-zA-Z0-9._%]@[a-zA-Z0-9]([\w\.\-]+)((\.([a-zA-Z]){2,4})+)$/im
字符串
在前端验证之后,注册过程调用一个API,该API使用Fluent Validation验证电子邮件。
要求:
通过jquery,某个电子邮件(testuser.@ domain.com)被成功验证,但fluent验证不批准它。需要成功验证和注册此类电子邮件。
**问题:**我发现我们可以使用以下代码在Fluent Validation中传递自定义正则表达式:
var RegisterEmailRegexPatternstring = userSettingService.CurrentUserSettings.RegisterEmailRegexPattern.Replace("/^","").Replace("/im","") ?? @"^(?!.*\.{2})[A-Z0-9_%][\w\.\+\-]*[a-zA-Z0-9_%]@[a-zA-Z0-9]([\w\-]+)((\.([a-zA-Z]){2,4})+)$";
var RegisterEmailRegexPattern = new Regex(RegisterEmailRegexPatternstring);
RuleFor(x => x.email).Matches(RegisterEmailRegexPattern);
型
但是在jquery中用于验证的正则表达式在.NET/C#中失败了,我无法找到它背后的原因。
问题:
1.为什么一个正则表达式在jquery中工作,但在.NET/C#中失败?
1.在这种情况下,可以采取哪些措施来防止出现此问题?
1条答案
按热度按时间nnvyjq4y1#
jQuery和.NET/C#使用的正则表达式引擎之间存在一些差异,这可能会导致某些模式的工作方式不同或根本不工作。一些共同的区别是:
jQuery使用JavaScript正则表达式引擎,它不支持命名捕获组、lookbehindAssert或Unicode字符类。.NET/C#支持所有这些功能以及更多功能。
jQuery使用/g标志来表示全局搜索,这意味着它将在输入字符串中找到所有匹配项。.NET/C#不使用标志,但有Regex.Matches或Regex.Replace等方法可以执行全局搜索。
jQuery使用/i标志来表示不区分大小写的搜索,这意味着它将忽略大小写字母之间的差异。.NET/C#使用RegexOptions.IgnoreCase枚举值来实现相同的效果。
jQuery使用/m标志来指示多行搜索,这意味着它将^和$锚视为匹配每行的开始和结束,而不是整个输入字符串。.NET/C#使用RegexOptions.Multiline枚举值来实现相同的效果。
在你的例子中,我认为问题是由jQuery正则表达式中的/m标志引起的。此标志使^和$锚点匹配输入字符串中每一行的开始和结束,而不是整个字符串。这意味着您的正则表达式将接受包含换行符(\n)的电子邮件,例如testuser.@ domain.com\n。但是,这不是有效的电子邮件地址,并且在.NET/C#中将失败,默认情况下不使用/m标志。
要解决这个问题,您可以从jQuery正则表达式中删除/m标志,或者将RegexOptions.Multiline值添加到.NET/C#正则表达式中。这将使两个正则表达式引擎的行为一致,并拒绝包含换行符的无效电子邮件。
您可以使用此方法在C#中验证电子邮件:
字符串