首页 > 解决方案 > 如何使用正则表达式验证逗号分隔的字符串

问题描述

我需要验证我的 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

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

标签: c#asp.netregex

解决方案


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

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

因此,将其可视化:

正则表达式可视化

在步骤:

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

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


推荐阅读