1

据我了解,括号增加了优先级,允许右侧的贪婪匹配优先于左侧的匹配。

我的问题是我想捕捉剩余的左手值,所以我需要用括号括起来。

有没有其他办法让右手朝上?

示例文本:

some words      blah blah   123

示例(错误)正则表达式:

/^([\w ]+)\s{2,}([\w ]+)\s{2,}([\w ]+)$/

我需要 \s+ 在抢空间时比 [\w ]+ 更贪婪。我可能能够排除单词中的多个空格与断言匹配,但我仍在努力解决它们。

4

2 回答 2

4

你的理解是不正确的。括号不会增加优先级,只是进行分组。问题是量词尽可能地前进,([\w ]+)直到最后两个空白字符匹配为止。您的示例不是很清楚,但您可以使用非贪婪量词添加额外的?.

这里有一个测试:

#!/usr/bin/env perl

use warnings;
use strict;

while ( <DATA> ) {
        m/^([\w ]+?)\s{2,}([\w ]+?)\s{2,}([\w ]+?)$/;
        print "$1 -- $2 -- $3\n";
}

__DATA__
some words      blah blah   123

这会产生:

some words -- blah blah -- 123
于 2013-10-25T23:41:12.970 回答
2

您永远不应该尝试将重叠的类与贪婪或非贪婪的量词混合。
你必须知道你想要什么,并划出不同的界限。

 # /^\s*(\w(?:[ ]?\w+)*)\s{2,}(\w(?:[ ]?\w+)*)\s{2,}(\w(?:[ ]?\w+)*)\s*$/

 (?x)                     # Modifier group, x = eXpanded
 ^                        # BOL
 \s*                      # optional many whitespaces at start
 ( \w (?: [ ]? \w+ )* )   # (1) word char start, word char end, optional 1 space between words
 \s{2,}                   # minimum 2 whitespace
 ( \w (?: [ ]? \w+ )* )   # (2) word char start, word char end, optional 1 space between words
 \s{2,}                   # minimum 2 whitespace
 ( \w (?: [ ]? \w+ )* )   # (3) word char start, word char end, optional 1 space between words
 \s*                      # optional many witespaces before end
 $                        # EOL
于 2013-10-26T00:24:37.713 回答