我正在尝试使用perl和regex在数组中保存匹配的模式,问题是当保存匹配时它会丢失一些字符
例如:
my @array;
my @temp_array;
@types_U8 = ("uint8","vuint8","UCHAR");
foreach my $type (@types_U8)
{
@temp_array = $str =~ /\(\s*\Q$type\E\s*\)\s*(0x[0-9ABCDEF]{3,}|\-[1-9]+)/g;
push(@array,@temp_array);
@temp_array = ();
}
所以如果$str = "any text (uint8)-1"
@temp_array
中保存的字符串只是“-1”
答案 0 :(得分:2)
您当前的正则表达式为:
/\(\s*\Q$type\E\s*\)\s*(0x[0-9ABCDEF]{3,}|\-[1-9]+)/g
这意味着
\(
\s*
$type
中存储的值:\Q$type\E
\s*
\)
\s*
(
0x[0-9ABCDEF]{3,}|\-[1-9]+
)
如果你注意到上述情况,你的捕获小组直到步骤#7才会启动,此时你还要捕获$type
和文字的parens。
扩展您的捕获组以包围这些区域:
/(\(\s*\Q$type\E\s*\)\s*(?:0x[0-9ABCDEF]{3,}|\-[1-9]+))/;
这意味着:
(
\(
\s*
$type
中存储的值:\Q$type\E
\s*
\)
\s*
(?:
0x[0-9ABCDEF]{3,}|\-[1-9]+
)
)
(注意:我删除了g
(全局)修饰符,因为它是不必要的)
此更改为我提供了(uint8)-1