我正在尝试解析这样的字符串。
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$
发布于 2014-08-19 23:07:33
据我所知,这可能对你有用:
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$)
如果这失败了(它可能会失败),你应该考虑使用实际的代码来确保它通过了“allow this X-
((X)(0*[1-9][0-9]?)X-
at the end \b0*([4]|1[0])\b
”
使用捕获组检查\3 == 'X'
或\3 == 'YZ'
,然后根据需要应用正则表达式的其余部分
https://stackoverflow.com/questions/25384391
复制相似问题