如何使用正则表达式验证逗号分隔的字符串 [重复]

Posted

技术标签:

【中文标题】如何使用正则表达式验证逗号分隔的字符串 [重复]【英文标题】:How to validate comma-separated string using Regex [duplicate] 【发布时间】:2020-08-24 19:12:01 【问题描述】:

我需要验证我的 c# 模型类。

[Required(ErrorMessage = "Comma Separated String Required")]
[RegularExpression(@"", ErrorMessage = "Invalid Comma Separated String.")]
[RegularExpression(@"", ErrorMessage = "Duplicate Code.")]
public string CommaSeparatedString  get; set; 

我刚刚尝试了以下正则表达式,但它不适合我。

((\s+)??(\d[a-z]|[a-z]\d|[a-z]),?)+?$

就我而言,CommaSeparatedString 可以是:

ASAEW1,ASAEW2,ASA,S4,ASAEW5,ASAEW6,ASAEW7 - Valid

ASAEW1,ASAEW2,ASA,S4,ASAEW5,ASAEW6,ASAEW7,ASAEW6 - Invalid - Duplicate ASAEW6

ASAEW1,ASAEW2,ASA,S4,ASAEW5,ASAEW6,ASAEW7, - Invalid - Comma at end

ASAEW1,ASAEW2,,ASA,S4,ASAEW5,ASAEW6,ASAEW7 - Invalid - No value between 2,3 comma

上述要求应该会发生。有没有办法检查逗号分隔字符串中的重复项?如果CommaSeparatedString 包含重复项,我需要显示'Duplicates code' 错误消息。我该怎么做?

【问题讨论】:

不是一个完整的答案,但我认为 FluentValidation 库会在这里创造奇迹,您可以在其中编写自定义验证规则。仅使用 RegEx,您不会走得太远,我认为您需要编写一些代码来拆分参数并检查它们的存在以及是否有任何重复 【参考方案1】:

我不是正则表达式魔术师,但我对一些可能对你有用的东西感到困惑here:

^((([A-Z]+\d*)(?!.*,\3\b)),)*[A-Z]+\d*$

所以要形象化:

分步:

^((( - 开始字符串 ancor,后跟三个捕获组 [A-Z]+\d* - 第三个捕获组必须存在大写字母(至少一个),后跟尽可能多的数字 (?!.*,\3\b) - 负前瞻,以确保先前找到的模式不会在后面有重复。 ),)* - 结束组 2 后跟逗号和结束组 1,然后必须尽可能多次出现 * [A-Z]+\d* - 最后一点是重复我们在第 3 组中寻找的相同模式 $ - 结束字符串 ancor

我也不是最擅长解释,但我希望它足够清楚并且有效(希望在 c# 中允许反向引用,因为我没有这方面的经验)=)

【讨论】:

先生,我怎样才能为 Invalid Comma Separated String.Comma Separated String Required 返回单独的模型验证?还是谢谢你的回答先生 @Adam,我无法为您提供c# 的其他帮助,因为上述模式应该适用于您提出的所有 4 个案例。如果没有帮助,请见谅。 谢谢你,先生。先生,您能否提供另一个正则表达式来检查 1. 结尾的逗号 2. 开头的逗号, 3. 逗号之间没有值。因为我打算在没有正则表达式的情况下检查重复的部分。 请帮帮我,先生,我怎样才能写一个正则表达式来检查这三个验证。 1.逗号结尾 2.逗号开头 3.逗号之间无值【参考方案2】:

您可以使用ASP.Net (Core?) framework 或FluentValidation Nuget 包查看模型的自定义验证。

对于仅取决于框架的解决方案,我编写了一个可能对您有用或至少可以帮助您入门的示例:

public class MyModel : IValidatableObject

    public string CommaSeparatedString  get; set; 


    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    
        if (CommaSeparatedString.EndsWith(","))
        
            yield return new ValidationResult("Invalid Comma Separated String - Comma at end");
        

        var splitCodes = CommaSeparatedString.Split(",");
        var setOfCodes = new HashSet<string>();
        foreach (var code in splitCodes)
        
            if (code.Trim() == String.Empty)
            
                yield return new ValidationResult("Invalid Comma Separated String - Missing Code");
                continue;
            

            var added = setOfCodes.Add(code);
            if (!added) yield return new ValidationResult($"Duplicate Code: code");
        
    

【讨论】:

我没有使用 .net 核心。还是谢谢 如何编写正则表达式来仅检查这三个验证? 1.逗号结尾 2.逗号开头 3.逗号之间无值 你为什么决定用正则表达式来处理这个问题?在另一个答案中,您获得了带有正则表达式的解决方案,但您需要区分错误。顺便说一句,相同的代码适用于 .NET 4.X,这就是我在括号中添加 Core 的原因,因为我不确定您使用的是哪个框架。 只是一些提示:首先,如果这是一个新应用程序,请考虑迁移到 .NET Core 的可能性。其次,关于 RegEx:在 RegEx 中进行验证将是调试和更改的巨大痛苦,最好更加明确并在代码中包含逻辑。有一句名言:有些人在遇到问题时会想“我知道,我会使用正则表达式”。现在他们有两个问题。

以上是关于如何使用正则表达式验证逗号分隔的字符串 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

逗号分隔的列表正则表达式 [重复]

带有逗号分隔符的数字的正则表达式验证

正则表达式捕获逗号分隔值

使用正则表达式从逗号分隔列表中删除重复项 [重复]

如何通过 Oracle regexp_replace 中的正则表达式从逗号分隔列表中删除重复项? [复制]

用于验证数字逗号分隔值的 Java 正则表达式