正则表达式:未能找到重复模式

时间:2013-08-07 02:24:08

标签: regex debugging regex-greedy

我希望能够在一行中捕获重复的组。我完成了我的工作,如下所示;

(((?:\s*^>\s*[0-9]+\s*,\s*[0-9]+\s*,\s*[a-zA-Z]+\s*(,\s*[a-zA-Z]+\s*)*;$\s*)|(?:\s*^>\s*[0-9]+\s*,\s*[0-9]+\s*,\s*[a-zA-Z]+\s*,\s*[0-9]+\s*(,\s*[\-]?[0-9]+\s*)*;$\s*))+)

Regular expression visualization

Edit live on Debuggex

它可以单独捕获> 9, 2, door, open;> 3, 3, door,1, 1;。但是,我也想捕获> 9, 2, door, close; > 1, 9, door, close; > 3, 3, door, 1, 1;。我在最后用括号+量词包围了我的组,但它没有正确地捕获重复模式。你能告诉我我做错了什么吗?

EDITED

我使正则表达式更短,如下所示;

(((\s*>\s*\d+\s*,\s*\d+\s*,\s*\w+\s*(,\s*\w+\s*)*;\s*)|(\s*>\s*\d+\s*,\s*\d+\s*,\s*\w+\s*,\s*\d+\s*(,\s*[\-]?\d+\s*)*;\s*))+)

Regular expression visualization

2 个答案:

答案 0 :(得分:2)

如果你想写

> 9, 2, door, close; > 1, 9, door, close; > 3, 3, door, 1, 1;

在一行中,所以你必须完全删除^$来修复你的正则表达式,这样才能匹配

(((?:\s*>\s*[0-9]+\s*,\s*[0-9]+\s*,\s*[a-zA-Z]+\s*(,\s*[a-zA-Z]+\s*)*;\s*)|(?:\s*>\s*[0-9]+\s*,\s*[0-9]+\s*,\s*[a-zA-Z]+\s*,\s*[0-9]+\s*(,\s*[\-]?[0-9]+\s*)*;\s*))+)

如果你的意思是

> 9, 2, door, close;
> 1, 9, door, close;
> 3, 3, door, 1, 1;

所以每个人都在一个单独的行中,你需要通过添加多行(/m(?m))修饰符来修复你的正则表达式,这样就匹配了

(?m)(((?:\s*^>\s*[0-9]+\s*,\s*[0-9]+\s*,\s*[a-zA-Z]+\s*(,\s*[a-zA-Z]+\s*)*;$\s*)|(?:\s*^>\s*[0-9]+\s*,\s*[0-9]+\s*,\s*[a-zA-Z]+\s*,\s*[0-9]+\s*(,\s*[\-]?[0-9]+\s*)*;$\s*))+)

希望这能解决您的问题

答案 1 :(得分:0)

我很抱歉,你的正则表达时间太长了以至于我无法阅读...如果你想要的话,你可以为每种格式创建一个不同的格式并包装所有这些,而不是聪明并创建一个小的正则表达式在parens和管道之间。例如, ((\d+)|([a-zA-Z]+))+

编辑:你好像在做那件事。为了方便起见,重新启动并首先单独写入每个。或者,您可以提供有关格式的更多详细信息,我们可以为您编写:3