提问人:Anvay Singh 提问时间:7/25/2023 更新时间:7/28/2023 访问量:57
使用的电子邮件正则表达式 Jquery 在 .Net C 中不起作用#
Email regex used Jquery does not work in .Net C#
问:
上下文:我有一个电子邮件正则表达式,在用户注册时在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,某封电子邮件([email protected])被成功验证,但流畅的验证不批准它。需要成功验证和注册此类电子邮件。
问题:我发现我们可以使用以下代码在 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#中失败,我无法找到其背后的原因。
问题:
- 为什么在jquery中起作用但在.NET/C#中失败的正则表达式?
- 在这种情况下,可以采取哪些措施来防止此问题?
答:
jQuery 和 .NET/C# 使用的正则表达式引擎之间存在一些差异,这可能会导致某些模式以不同的方式工作或根本无法工作。一些常见的区别是:
jQuery 使用 JavaScript 正则表达式引擎,该引擎不支持命名捕获组、后视断言或 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) 的电子邮件,例如 [email protected]\n。但是,这不是一个有效的电子邮件地址,它将在 .NET/C# 中失败,默认情况下不使用 /m 标志。
若要解决此问题,可以从 jQuery 正则表达式中删除 /m 标志,也可以将 RegexOptions.Multiline 值添加到 .NET/C# 正则表达式中。这将使两个正则表达式引擎的行为一致,并拒绝包含换行符的无效电子邮件。
可以使用此方法在 C# 中验证电子邮件:
public static Regex EmailRegex =>
new(@"\A(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)\Z", RegexOptions.IgnoreCase);
bool isValidEmail = EmailRegex.IsMatch("[email protected]");
评论
{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_
");
评论
.Replace("/im","")
在这里,您将从正则表达式中删除多行和不区分大小写的选项。您可以尝试var RegisterEmailRegexPattern = new Regex(RegisterEmailRegexPatternstring, RegexOptions.IgnoreCase | RegexOptions.Multiline);