Regex PHP中使用分隔符按正确顺序对字符串进行正则表达式验证

Regex PHP中使用分隔符按正确顺序对字符串进行正则表达式验证,regex,Regex,我试图创建一个表达式来验证提供的字符串是否是有效的格式,但似乎如果几个月内不使用正则表达式,我就会忘记所学的一切,不得不重新学习 我的表达式应该匹配以下格式:010L0404FFCCAANFCC0M000000xxxxxx 四个分隔符为(L、N、K、M),不在0-9A-F十六进制范围内,以表示唯一性必须按该顺序排列,否则不在列表中。每个分隔符只能存在一次 它可以分解为: 以3位数字开始,它只是^([0-9]{3})并且总是必需的 第二组以L开头,必须是2位数+2位数+6十六进制,并且是可选的

我试图创建一个表达式来验证提供的字符串是否是有效的格式,但似乎如果几个月内不使用正则表达式,我就会忘记所学的一切,不得不重新学习

我的表达式应该匹配以下格式:010L0404FFCCAANFCC0M000000xxxxxx 四个分隔符为(L、N、K、M),不在0-9A-F十六进制范围内,以表示唯一性必须按该顺序排列,否则不在列表中。每个分隔符只能存在一次

它可以分解为:

  • 以3位数字开始,它只是^([0-9]{3})并且总是必需的
  • 第二组以L开头,必须是2位数+2位数+6十六进制,并且是可选的
  • 第三组以N开头,必须是6位十六进制,是可选的
  • 第四组K是任意数量的数字,是可选的
  • 第五组是M,可以是任意6个十六进制或XXXXXX,表示无任何内容,必须是6的倍数,不包括0,如336699(6)或336699xxxxxffcc00(18),并且是可选的
最难的部分我想不出是什么让它需要它按那个顺序,以倍数的形式,比如L分隔符必须在前面,K总是在那里(原因是我没有得到相同字符串的变体,这意味着相同的事情与分隔符交换)。我已经可以解析它了,我只想验证字符串的格式是否正确


任何帮助都将不胜感激,谢谢。

需要订单并不太糟糕。只需将每一组设置为可选。正则表达式仍将按顺序匹配,因此,例如,如果L部分不在那里,而下一个字符是N,则它不会让L稍后出现,因为它不会匹配正则表达式的任何其他部分

^([0-9]{3})(L[0-9]{4}[0-9A-F]{6})?(N[0-9A-F]{6})?(K[0-9]+)?(M([0-9A-F]{6})+|MX{6})$
我相信您的要求的直接翻译是:

^([0-9]{3})(L[0-9]{4}[0-9A-F]{6})?(N[0-9A-F]{6})?(K[0-9]+)?(M([0-9A-F]{6}|X{6})+)?$

没有真正的技巧,只是让每个组都是可选的,前三个数字除外,并为M块中六个数字的两种模式添加一个内部替代方案。

Whoops,忽略了您的示例336699xxxxxffcc00。哦,好的。有没有办法指定正则表达式为M组做6的倍数?是的,M组可以完全按照@rra已经做的那样:
(M([0-9A-F]{6}X{6})+?
我觉得自己像个白痴,谢谢你的帮助。对于任何阅读的人来说,轻微的打字错误M([0-9A-Z]应该是M([0-9A-F]