有一个子来处理类型和值。
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+(.*?)>/
谢谢。
答案 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+(.*?)>