据我了解,括号增加了优先级,允许右侧的贪婪匹配优先于左侧的匹配。
我的问题是我想捕捉剩余的左手值,所以我需要用括号括起来。
有没有其他办法让右手朝上?
示例文本:
some words blah blah 123
示例(错误)正则表达式:
/^([\w ]+)\s{2,}([\w ]+)\s{2,}([\w ]+)$/
我需要 \s+ 在抢空间时比 [\w ]+ 更贪婪。我可能能够排除单词中的多个空格与断言匹配,但我仍在努力解决它们。
据我了解,括号增加了优先级,允许右侧的贪婪匹配优先于左侧的匹配。
我的问题是我想捕捉剩余的左手值,所以我需要用括号括起来。
有没有其他办法让右手朝上?
示例文本:
some words blah blah 123
示例(错误)正则表达式:
/^([\w ]+)\s{2,}([\w ]+)\s{2,}([\w ]+)$/
我需要 \s+ 在抢空间时比 [\w ]+ 更贪婪。我可能能够排除单词中的多个空格与断言匹配,但我仍在努力解决它们。
你的理解是不正确的。括号不会增加优先级,只是进行分组。问题是量词尽可能地前进,([\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
您永远不应该尝试将重叠的类与贪婪或非贪婪的量词混合。
你必须知道你想要什么,并划出不同的界限。
# /^\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