正则表达式(/<(\w+)\s+(.*?)&gt ;/)需要改进

时间:2010-01-12 08:24:52

标签: regex perl

有一个子来处理类型和值。

sub parse_type_value_specifier { 
    my $tvs = shift; 
    my ($type, $value) = $tvs =~ /<(\w+)\s+(.*?)>/;
    return $type, $value; 
}

它应该适合以下三种格式。

<B 0> - works, return $type = (B) and $value = (0)
<A[1..80] ""> - doesn't work, need return $type = A[1..80] and $value = () # empty
<A[1..80] "hello"> - doesn't work. need return $type = A[1..80] and $value = (hello)

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

6 个答案:

答案 0 :(得分:3)

怎么样

/<([\w\[\].]+)\s*"?([^">]*)"?>/

/<(\w+)\s*"?([^">]*)"?>/如果您的A [1..80]表示\ w长度为1到80

答案 1 :(得分:2)

试试这个:

/<(\w{1,80})\s*(?:\s([^\s">]+|"[^"]*"))?>/

现在,如果第二个分组的匹配以"开头,则从开头和结尾删除它,并且您具有普通值。

答案 2 :(得分:2)

以下“适用”您输入的输入,但您应提供更完整的规范:

#!/usr/bin/perl

use strict; use warnings;

while ( <DATA> ) {
    if ( my ($type, $value) = /^<([A-Z])(?:\[.+\])?\s+"?(\w*)"?>/ ) {
        print "\$type = $type\t\$value = $value\n";
    }
}

__DATA__
<B 0>
<A[1..80] "">
<A[1..80] "hello">

输出:

$type = B       $value = 0
$type = A       $value =
$type = A       $value = hello

答案 3 :(得分:1)

听起来你想忽略"。通过另一个正则表达式来运行它以首先去除它们。

答案 4 :(得分:1)

试试这个

<(.+) +"?(.*?)"?>

答案 5 :(得分:1)

你的正则表达式是99%正确,问题是\w与文字方括号[]不匹配。只需使用合适的字符类[\w\[\]\.]+

进行重新设计
<([\w\[\]\.]+)\s+(.*?)>