0

我正在尝试解析这样的字符串

99_GOG_A_X1_FOO X-2014-09
99_YAK_A_YZ1_BAR YZY-2014-10

用这个正则表达式

99_\w{3}_(A|B)_((X)(0*[1-9][0-9]?)_(FOO|BAR) X-(\b0*20(1[4-9]|[2-9][0-9])\b)-\b0*([1-9]|1[0-2])\b|(YZ)(0*[1-9][0-9]?)_(FOO|BAR) YZY-(\b0*20(1[4-9]|[2-9][0-9])\b)-\b0*([4]|1[0])\b)

第一个输入最后只能有 1 到 12,而第二个输入只能有 04 或 10。这行得通。但我想要一个只返回匹配组的解决方案。

有了这个解决方案,我有这些组http://www.regexplanet.com/cookbook/ahJzfnJlZ2V4cGxhbmV0LWhyZHNyDwsSBlJlY2lwZRiwuuALDA/index.html

我有多余的组,并且匹配组不在两个输入的相同索引上。

有没有办法摆脱空组并对齐索引?

更新:我必须遵守以下规则。如果输入与此匹配,_((X)(0*[1-9][0-9]?)则它还必须X-在末尾包含并允许此范围\b0*([4]|1[0])\b

如果输入与此匹配,_(YZ)(0*[1-9][0-9]?)则它还必须YZY-在最后包含并仅允许此输入\b0*([4]|1[0])\b

所以我想结合这些正则表达式:

^99_\w{3}_(A|B)_(X)(0*[1-9][0-9]?)_(FOO|BAR) X-(\b0*20(1[4-9]|[2-9][0-9])\b)-\b0*([1-9]|1[0-2])\b$
^99_\w{3}_(A|B)_(YZ)(0*[1-9][0-9]?)_(FOO|BAR) YZY-(\b0*20(1[4-9]|[2-9][0-9])\b)-\b0*([4]|1[0])\b$
4

1 回答 1

0

据我了解,这可能对您有用:

99_\w{3}_(A|B)_((X|(?>YZ))(0*[1-9][0-9]?)_(FOO|BAR) \3Y?-(\b0?20(1[4-9]|[2-9][0-9])\b)-\b0?((?:[1-9]|1[0-2])|(?:[4]|1[0]))\b$)

演示

如果这失败(它可能),您应该考虑使用实际代码来确保它通过“((X)(0*[1-9][0-9]?)它还必须包含X-并在末尾允许这个范围\b0*([4]|1[0])\b

使用捕获组检查是否\3 == 'X'或是否\3 == 'YZ',然后根据需要应用正则表达式的其余部分

于 2014-08-19T15:07:32.867 回答