perl regex:如何捕获多组仅使用一个快递?

时间:2015-12-09 06:31:11

标签: regex perl

Text 1 : 
do not match: nw, n, s and somethingelse.
all directions are: n, w, s and e.
Expect :{n, w, s, e}


Text 2 : 
do not match: nw, n, s and somethingelse.
all directions are: nw, sw, se, w, ..., s and e.
Expect :{nw, sw, se, w, ..., s, e} 

是否可以在一个快递中捕捉所有方向?

3 个答案:

答案 0 :(得分:0)

你在找这样的东西吗?

my $text = "all directions are: nw, sw, se, w, ..., s and e.";

if( $text =~ /all directions are:\s+(([^,]+,\s+)+)(\w+)\s+and\s+(\w+)\./)
{
    print "$1 $3, $4\n";
}

输出: nw, sw, se, w, ..., s, e

说明:

([^,]+,\s+)匹配目录名称后跟逗号(,)和一些空格。这可以在字符串中重复n次。

然后我们必须匹配x and y部分。 (\w+)\s+and\s+(\w+)\.会照顾到这一点。

答案 1 :(得分:0)

如下所述,无法捕获一个表达式:Python regular expressions - how to capture multiple groups from a wildcard expression?

你问题的灵魂可能就是:

spacemacs/sudo-edit

答案 2 :(得分:0)

虽然正如Phyreprooph所解释的那样,使用单个表达式是不可能的,但您可以使用/g(“global”)修饰符多次匹配并生成匹配列表,如下所示:

if(/all directions are:\s*(.*)/) {
    @dir = $1 =~ /(\.\.\.|\b[nsew]{1,2}\b)/g;
    print "{", join(", ", @dir), "}\n";
}