如何改进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>
。
答案 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+
。