【问题标题】:perl regex - catching four numbers separated by spaceperl 正则表达式 - 捕获用空格分隔的四个数字
【发布时间】:2015-02-27 19:36:39
【问题描述】:

我知道我们可以在 perl 中使用正则表达式来捕获使用 [\d] 的数字,但我的模式是这样的:

261 193 546 302

或者它可能是这样的:

16 0 98 120

关键是 - 我只想抓住一条任何四个数字用空格分隔的行。每个数字可以由任意位数组成,可以是一位数,也可以是两位数,等等。

【问题讨论】:

    标签: regex perl


    【解决方案1】:
    ^\d+(?:\s+\d+){3}$
    

    试试这个。这应该适合你。

    【讨论】:

      【解决方案2】:

      您不必明确地将令牌包装在字符类中。为此,您要断言字符串的开头和字符串位置的结尾,因此我将使用锚点并量化非捕获组“3”次。

      ^\d+(?: \d+){3}$
      

      解释:

      ^         # the beginning of the string
      \d+       # digits (0-9) (1 or more times)
      (?:       # group, but do not capture (3 times):
                #   ' '
        \d+     #   digits (0-9) (1 or more times)
      ){3}      # end of grouping
      $         # before an optional \n, and the end of the string
      

      【讨论】:

      • 不要忘记使用 \ [ ] 来表示该空间。
      【解决方案3】:

      根据您的要求,“捕获包含由空格分隔的任意四个数字的行”。我将使用以下内容,因为它包含一个捕获组,该组将包含您的数字序列,并将忽略任何前导或尾随空格。

      ((?:\d+\s){3}\d+)
      

      REGEX101

      在 Perl 中的使用

      $re = "/((?:\\d+\\s){3}\\d+)/"; 
      

      如您所见,它将完全匹配由单个空格分隔的 4 个数字,并且将忽略前后字符。

      替代

      如果您是明确的并且实际上想要捕获包含任何其他字符的整个行,这将更适合。

      (^.*(?:\d+\s){3}\d+.*$)
      

      REGEX101

      在 Perl 中的用法

      $re = "/(^.*(?:\\d+\\s){3}\\d+.*$)/mx"; 
      

      请注意,由于其结构方式,这将匹配带小数位的数字。

      【讨论】:

        【解决方案4】:

        试试^\d+\s\d+\s\d+\s\d+$。这将匹配 4 个带空格的数字,仅此而已。

        Sample

        【讨论】:

        • @smerny 没错,应该是 \d+。一秒搞定
        • 同时使用 \s+。更可靠。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-03-21
        • 1970-01-01
        • 2017-07-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多