0

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

我的表达式应该匹配这样的格式:010L0404FFCCAANFFCC00M000000XXXXXX 这四个分隔符是 (L, N, K, M),它们不在 0-9A-F 十六进制范围内,以指示唯一性必须按该顺序或不在列表中。每个分隔符只能存在一次!

它分解为:

  • 以 3 位数字开头,它只是 ^([0-9]{3}) 并且始终是必需的
  • 第二组以 L 开头,必须是 2 位 + 2 位 + 6 位十六进制,可选
  • 第三组以 N 开头,必须是 6 位十六进制,可选
  • 第四组 K 是任意数量的数字,是可选的
  • 第五组是M,可以是任意6个16进制或XXXXXX表示无,必须是6的倍数,不包括0,如336699(6)或336699XXXXXXFFCC00(18),可选

最难的部分我无法弄清楚使其按顺序和倍数需要它,例如 L 定界符必须在之前,并且 K 总是如果它在那里(原因是我没有得到相同字符串的变体,这意味着相同分隔符交换的东西)。我已经可以解析它了,我只想验证字符串的格式是否正确。

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

4

2 回答 2

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})$
于 2013-03-18T07:09:20.670 回答
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 块中的两个六位数模式添加一个内部替代方案。

于 2013-03-18T07:09:37.470 回答