多个逗号分隔的两种模式的正则表达式验证不起作用

Regex validation of two patterns multiple comma-separated doesn't work

在 ASP.NET 表单中,我试图找到一个允许多个逗号分隔元素的模式,但它似乎不起作用。我需要允许 4 个字母和 2 个数字 (JEAN01) 或 2 个数字和 4 个字母 (01JEAN) 任意次数:JEAN01,JEAN02,03JEAN,JEAN04

我的第一次尝试(参见 https://regex101.com/r/E4JZVv/1)是:

/^([a-z-A-Z]{4}[0-9]{2}|[a-z-A-Z]{2}[0-9]{4})(,[a-z-A-Z]{4}[0-9]{2}|[a-z-A-Z]{2}[0-9]{4})*$

我的第二次尝试(https://regex101.com/r/HU9cOS/1)是

((^|[,])[a-z-A-Z]{4}[0-9]{2}|[a-z-A-Z]{2}[0-9]{4})+

第一个只接受几个元素。

这应该可以解决问题:

^((\w{4}\d{2}|\d{2}\w{4})(,|$))+

参见:https://regex101.com/r/8hoNXl/1


解释:

  • ^:声明字符串开头的位置
  • \w{4}\d{2}: 4个字母和2个数字
  • \d{2}\w{4}: 2位数字和4个字母
  • (,|$),或字符串结尾
  • +:重复一次到无限次(贪心)

您第一次尝试的设置很好,只有:

  • 你要匹配与这部分不同的4 letters and 2 digits or 2 digits and 4 letters[a-z-A-Z]{2}[0-9]{4}
  • 在第二部分的组重复中,你必须重复逗号并将后面的交替本身也放在一个组中,这样逗号就可以在两个交替前加上

使用不区分大小写的匹配:

(?i)^(?:[a-z]{4}[0-9]{2}|[0-9]{2}[a-z]{4})(?:,(?:[a-z]{4}[0-9]{2}|[0-9]{2}[a-z]{4}))*$

看到一个regex demo

对于您尝试的第二个模式,字符串开头的断言不应交替出现,否则您可以进行部分匹配,因为它也允许使用逗号。

您可以在末尾使用逗号重复交替。如果您不想让字符串以逗号开头,您可以使用否定先行 (?!,) 并在断言字符串开头后使用交替。

(?i)^(?!,)((?:,|^)(?:[a-z]{4}[0-9]{2}|[0-9]{2}[a-z]{4}))+$

再看一个regex demo