Perl正则表达式 - 捕获由空格分隔的四个数字

3

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

261 193 546 302

或者可以这样:
16 0 98 120

重点是 - 我只想捕捉一个由空格分隔的任意四个数字组成的行。每个数字可以由任意数量的数字组成,可以是一位数、两位数等。

4个回答

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

尝试这个。这应该能解决你的问题。

3

您不必明确地将令牌包装在字符类中。为此,您需要断言字符串的开头和结尾位置,因此我会使用锚点并量化一个非捕获组“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

1
不要忘记在空格处使用 \[ ] - user557597

2

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

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

REGEX101

在 Perl 中的使用方法

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

如您所见,它将完全匹配由单个空格分隔的4个数字,并忽略前导和尾随字符。 备选方案 如果您想要明确地捕获整行(包括任何其他字符),那么这将更加合适。
(^.*(?:\d+\s){3}\d+.*$)

正则表达式101

在Perl中的使用

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

请注意,由于其结构方式,此代码将匹配带有小数点的数字。

1
尝试使用^\d+\s\d+\s\d+\s\d+$。这将匹配4个数字,带有空格且没有其他内容。

示例


@smerny 你说得对,应该是\d+。我马上修复。 - David says Reinstate Monica
在此过程中,也请使用\s+。更加可靠。 - Dirk Koopman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接