Regex 如何定义这个交替的正则表达式,使其在匹配中具有相同数量的组?

Regex 如何定义这个交替的正则表达式,使其在匹配中具有相同数量的组?,regex,parsing,conditional,alternation,Regex,Parsing,Conditional,Alternation,我正在尝试解析这样的字符串 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]|

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

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个。 这很有效。但我希望有一个只返回匹配组的解决方案

有了这个解决方案,我就有了这些小组

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

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

更新: 我必须遵守以下规则。 如果输入匹配此
((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$

据我所知,这可能适用于您:

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'
,然后根据需要应用剩余的正则表达式

而不是使用冗长的正则表达式,您应该尝试在下划线、空格和破折号上拆分。这将更具可读性,并且在必要时更容易更改。但是,如果您一直使用正则表达式x、 。我尽力维护您的索引。我已使用所需的规则更新了问题。您应该发布一个格式类似的字符串,但不应与正则表达式匹配。这比阅读规则更容易操作(尽管正则表达式总是适用于规则)。我已经添加了两个正则表达式,我想组合它们。这允许这些输入:
99_YAK_A_X1_BAR YZY-2014-10
99_GOG_A_YZ1_FOO X-2014-10
我想我会选择两个正则表达式来测试输入。因此,输入要么匹配第一个、第二个或没有正则表达式。不,在这方面失败:
99\G也许OGYAXX1FOX-2014-11 @ MRT181?如果这不起作用,你绝对应该考虑使用真正的逻辑语句而不是仅仅依靠正则表达式。祝你好运!最后一个看起来不错:)我将研究你使用的结构,增加样本输入。