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?如果这不起作用,你绝对应该考虑使用真正的逻辑语句而不是仅仅依靠正则表达式。祝你好运!最后一个看起来不错:)我将研究你使用的结构,增加样本输入。