【问题标题】:Capture indefinite amount of numbers with Regex?使用正则表达式捕获无限数量的数字?
【发布时间】:2010-11-29 00:35:52
【问题描述】:

我想在可能包含无限数量的数字的字符串上使用正则表达式获取捕获。我的直觉引导我做"/\.getnumbers (\d+)+\s*/",但它只匹配.getnumbers 命令之后的第一个数字。如何编写一个正则表达式语句,该语句将在命令后捕获一个或多个数字,用一个简单的空格分隔。例如:.getnumbers 5 4 3 2 1 将匹配 (5) (4) (3) (2) (1),虽然 regex 不是专门为匹配 5 个数字而编写的,但它可以匹配任意数量的数字。

【问题讨论】:

    标签: regex pattern-matching infinite-sequence


    【解决方案1】:

    如果没有后处理,您可能无法做到这一点,因为大多数正则表达式引擎不允许无限数量的组。幸运的是,后处理只包括按空格分割。

    /\.getnumbers (\d+(?: \d+)*)/
    

    【讨论】:

    • 我同意尝试为每个组设置单独的组没有多大意义,但我不知道“大多数正则表达式引擎不允许无限数量的组”。我知道 Perl 和 PCRE 都只受可用虚拟内存的限制。什么常用的语言比这更严格? (谢谢。)
    • @tchrist:它们允许您拥有任意大的、确定数量的组。但是您仍然需要每组一对()
    • 啊,我明白了。人们总是希望/(?:\b(\d+)\b\s*)+/ 不仅仅填充该模式所解释的$1。当它们匹配 "12 345 523" =~ /(?:\b(?<N>\d+)\b\s*)+/ 时问题再次出现,现在发现 @{ $-{N} } 包含所有匹配项的列表。
    【解决方案2】:
    /\.getnumbers (\d+(?:\s+\d+)*)/
    

    请注意,您将获得所有数字作为单个捕获组。例如:“5 4 3 2 1”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-18
      • 2019-10-08
      • 2012-03-31
      相关资源
      最近更新 更多