【发布时间】:2015-02-27 19:36:39
【问题描述】:
我知道我们可以在 perl 中使用正则表达式来捕获使用 [\d] 的数字,但我的模式是这样的:
261 193 546 302
或者它可能是这样的:
16 0 98 120
关键是 - 我只想抓住一条任何四个数字用空格分隔的行。每个数字可以由任意位数组成,可以是一位数,也可以是两位数,等等。
【问题讨论】:
我知道我们可以在 perl 中使用正则表达式来捕获使用 [\d] 的数字,但我的模式是这样的:
261 193 546 302
或者它可能是这样的:
16 0 98 120
关键是 - 我只想抓住一条任何四个数字用空格分隔的行。每个数字可以由任意位数组成,可以是一位数,也可以是两位数,等等。
【问题讨论】:
^\d+(?:\s+\d+){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
【讨论】:
\ 或 [ ] 来表示该空间。
根据您的要求,“捕获包含由空格分隔的任意四个数字的行”。我将使用以下内容,因为它包含一个捕获组,该组将包含您的数字序列,并将忽略任何前导或尾随空格。
((?:\d+\s){3}\d+)
在 Perl 中的使用
$re = "/((?:\\d+\\s){3}\\d+)/";
如您所见,它将完全匹配由单个空格分隔的 4 个数字,并且将忽略前后字符。
替代
如果您是明确的并且实际上想要捕获包含任何其他字符的整个行,这将更适合。
(^.*(?:\d+\s){3}\d+.*$)
在 Perl 中的用法
$re = "/(^.*(?:\\d+\\s){3}\\d+.*$)/mx";
请注意,由于其结构方式,这将匹配带小数位的数字。
【讨论】:
试试^\d+\s\d+\s\d+\s\d+$。这将匹配 4 个带空格的数字,仅此而已。
【讨论】: