如何在Perl中匹配混合空格和()?

时间:2010-01-21 07:42:44

标签: regex perl

如何改进Perl正则表达式来处理下面的__DATA__

my ($type, $value) =~ /<(\w+)\s+(.*?)\(\)>/;  

__DATA__
<dynamic DynamicVar>
<dynamic DynamicVar > # not need attache the blackspace to $value when return
<dynamic DynamicFun()>
<dynamic DynamicFun() > # not need attache the blackspace to $value when return

我想以此格式$type返回$value<$type $value>

3 个答案:

答案 0 :(得分:7)

不要担心内容的细节,只需匹配括号内的任何内容。

my($type, $value) = m{< (\w+) \s+ (.*?) \s* >}x;

.*?意味着匹配任何非贪婪,这意味着它将寻找匹配的第一件事,而不是最长的。这意味着它不会在最后拾取空格,它将留给\s*。这也意味着它不会被<foo bar> and then a >愚弄。

答案 1 :(得分:4)

你得到了答案,但这是另一种方式,正则规则较小。

while(<DATA>){
    chomp;
    s/[<>]//g;
    my ($type, $value) = split /\s+/ ;
    print "type: $type\n";
    print "value: $value\n";
}

答案 2 :(得分:1)

试试这个正则表达式:

/<(\w+)\s+(.*?)(?:\s*\(\)\s*)?>/

但我也会用更具体的东西取代.*?。如果你只是想要单词字符,你也可以在这里使用\w+