使用perl和regex无法在数组中保存模式匹配

时间:2014-03-19 14:46:52

标签: regex perl pattern-matching

我正在尝试使用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”

1 个答案:

答案 0 :(得分:2)

您当前的正则表达式为:

/\(\s*\Q$type\E\s*\)\s*(0x[0-9ABCDEF]{3,}|\-[1-9]+)/g

这意味着

  1. 匹配文字左边的paren:\(
  2. 匹配零个或多个空格字符:\s*
  3. 匹配$type中存储的值:\Q$type\E
  4. 匹配更多空白字符的零:\s*
  5. 匹配文字权利paren:\)
  6. 匹配更多空白字符的零:\s*
  7. 开始捕获群组:(
  8. 匹配前缀为0x的3位十六进制数字  要么 匹配文字短划线,后跟1到9的1位或更多位数:0x[0-9ABCDEF]{3,}|\-[1-9]+
  9. END捕获组:)
  10. 如果你注意到上述情况,你的捕获小组直到步骤#7才会启动,此时你还要捕获$type和文字的parens。

    扩展您的捕获组以包围这些区域:

    /(\(\s*\Q$type\E\s*\)\s*(?:0x[0-9ABCDEF]{3,}|\-[1-9]+))/;
    

    这意味着:

    1. 开始捕获论坛:(
    2. 匹配文字左边的paren:\(
    3. 匹配零个或多个空格字符:\s*
    4. 匹配$type中存储的值:\Q$type\E
    5. 匹配更多空白字符的零:\s*
    6. 匹配文字权利paren:\)
    7. 匹配更多空白字符的零:\s*
    8. START非捕获组:(?:
    9. 匹配前缀为0x的3位十六进制数字  要么 匹配文字短划线,后跟1到9的1位或更多位数:0x[0-9ABCDEF]{3,}|\-[1-9]+
    10. 结束非捕获组:)
    11. END捕获组:)
    12. (注意:我删除了g(全局)修饰符,因为它是不必要的)

      此更改为我提供了(uint8)-1

      的结果