据我了解,括号增加优先权,允许右边的贪婪匹配优先于左边的一个。
我的问题是我想要抓住剩余的左手值,所以我需要将其括起来。
还有其他方法可以将右手边抬起来吗?
示例文字:
some words blah blah 123
示例(错误)正则表达式:
/^([\w ]+)\s{2,}([\w ]+)\s{2,}([\w ]+)$/
我需要\ s +在抓取空间时比[\ w] +更贪婪。我或许可以排除单词中与句子匹配的多个空格,但我仍然试图绕过它们。
答案 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