使用PHP中的分隔符以正确顺序验证字符串的正则表达式

时间:2013-03-18 07:01:07

标签: regex

我正在尝试创建一个表达式来验证提供的字符串是否是有效的格式,但似乎如果我在几个月内不使用正则表达式,我会忘记我学到的所有内容并且必须重新学习它。< / p>

我的表达式应符合以下格式:010L0404FFCCAANFFCC00M000000XXXXXX 四个分隔符是(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)或336699XXXXXXFFCC00(18)并且是可选的

最难的部分我无法弄清楚它是否需要它按顺序排列,并且在倍数中,如L分隔符必须在之前,而K总是如果它在那里(原因所以我不会得到相同字符串的变体与交换分隔符相同的意思)。我已经可以解析它了,我只是想验证字符串格式是否正确。

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

2 个答案:

答案 0 :(得分:1)

^([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})$

答案 1 :(得分:1)

要求订单并不算太糟糕。只需使每组都可选。正则表达式仍将按顺序匹配,因此如果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}|X{6})+)?$

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