有没有办法在正则表达式中强制优先(perl风格)

时间:2013-10-25 23:17:45

标签: regex perl regex-lookarounds

据我了解,括号增加优先权,允许右边的贪婪匹配优先于左边的一个。

我的问题是我想要抓住剩余的左手值,所以我需要将其括起来。

还有其他方法可以将右手边抬起来吗?

示例文字:

some words      blah blah   123

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

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

我需要\ s +在抓取空间时比[\ w] +更贪婪。我或许可以排除单词中与句子匹配的多个空格,但我仍然试图绕过它们。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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