Jquery在.Net C#中不起作用

k4aesqcs  于 2023-08-04  发布在  jQuery
关注(0)|答案(1)|浏览(117)

**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.在这种情况下,可以采取哪些措施来防止出现此问题?

nnvyjq4y

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#中验证电子邮件:

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("test@gmail.com");

字符串

相关问题