使用的电子邮件正则表达式 Jquery 在 .Net C 中不起作用#

Email regex used Jquery does not work in .Net C#

提问人:Anvay Singh 提问时间:7/25/2023 更新时间:7/28/2023 访问量:57

问:

上下文:我有一个电子邮件正则表达式,在用户注册时在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#中失败,我无法找到其背后的原因。

问题:

  1. 为什么在jquery中起作用但在.NET/C#中失败的正则表达式?
  2. 在这种情况下,可以采取哪些措施来防止此问题?
C# jQuery .NET 正则表达式 FluentValidation

评论

0赞 prinkpan 7/25/2023
.Replace("/im","")在这里,您将从正则表达式中删除多行和不区分大小写的选项。您可以尝试var RegisterEmailRegexPattern = new Regex(RegisterEmailRegexPatternstring, RegexOptions.IgnoreCase | RegexOptions.Multiline);
1赞 Jonathan Dodds 7/25/2023
正则表达式有不同的变体(就像 markdown 有不同的变体一样)。在 JQuery 使用的正则表达式引擎中工作的正则表达式可能不受 .NET 使用的正则表达式引擎的支持。有支持多种变体的正则表达式测试工具。这样的工具可以帮助找到正则表达式在 .NET 正则表达式引擎上不起作用的原因,并可以帮助开发一种可能在两个引擎中都有效的通用表达式。

答:

-1赞 Saeed Gholamzadeh 7/25/2023 #1

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]");

评论

0赞 Anvay Singh 7/27/2023
var registerEmailRegexPatternString = @“^(?!.*\.{2})[A-Z0-9_%][\w\.\+\-]*[a-zA-Z0-9-_.%]@[a-zA-Z0-9]([\w\.\-]+)((\.([a-zA-Z]){2,4})+)$";var RegisterEmailRegexPattern = new Regex(registerEmailRegexPatternString, RegexOptions.IgnoreCase |RegexOptions.Multiline);规则 (x => x.Email)。匹配 (RegisterEmailRegexPattern) 这是我尝试过的,它不允许简单的电子邮件: [EMAIL PROTECTED] 这里缺少什么吗?
0赞 Saeed Gholamzadeh 7/28/2023
首先,像这样定义这个正则表达式: 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])?)\Z“, RegexOptions.IgnoreCase);然后使用它: bool isEmail = EmailRegex.IsMatch(“[email protected]{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_");
0赞 Saeed Gholamzadeh 7/28/2023
我在回复中包括了这种方法。