【问题标题】:Regex: Fail to find repeating pattern正则表达式:找不到重复模式
【发布时间】:2013-08-07 02:24:07
【问题描述】:

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

(((?:\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*))+)

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;。我通过在末尾使用带 + 量词的括号括起我的组,但它没有正确捕获重复模式。你能告诉我我哪里做错了吗?

已编辑

我将正则表达式缩短如下;

(((\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*))+)

【问题讨论】:

    标签: regex debugging regex-greedy


    【解决方案1】:

    如果你想写

    > 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*))+)
    

    希望这能解决您的问题

    【讨论】:

    • 不要使用\w 而不是[a-zA-Z],除非你是认真的,因为它取决于你的语言环境,它也可能包括_
    • 您在我找出答案的同时发布了答案。我会接受这个作为答案,因为你提供了一些我从未见过的有价值的信息,\w vs [a-zA-Z]
    【解决方案2】:

    对不起,您的正则表达式太长了,我无法阅读...与其聪明地创建一个小的正则表达式,如果您愿意,您可以为每种格式创建一个不同的正则表达式并将所有这些都包装起来在parens中并在两者之间放置管道。例如, ((\d+)|([a-zA-Z]+))+

    编辑:您似乎正在这样做。为了方便起见,重新启动并首先单独编写每一个。或者,您可以提供有关格式的更多详细信息,我们可以为您编写:3

    【讨论】:

    • 谢谢。格式类似于上面给出的示例。 > 9, 2, door, close; > 1, 9, door, close; > 3, 3, door, 1, 1;请不要为我写,我宁愿自己写。不过谢谢你的提议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-12
    • 2017-01-09
    • 2021-10-12
    • 2016-11-16
    • 2016-01-11
    • 1970-01-01
    • 2016-01-18
    相关资源
    最近更新 更多