通过perl中的正则表达式从行中提取GUID

时间:2013-06-17 11:09:00

标签: regex perl expression guid

我在测试时以及从文本文件行成功提取GUID时遇到问题。给定一个guid 12345678-1234-1234-1234-123456789abc,其中允许所有十六进制字符(我使用数字和abc显示每个子字符串包含的字符数),我尝试了这样的

my $myline = "  set whatevervariable = \'aaaaaaaa-bbbb-cccc-1234-aaaaaaaabbbb\'";
my $guid =($myline =~ m/[A-Fa-f0-9]{8}[\-][A-Fa-f0-9]{4}[\-][A-Fa-f0-9]{4}[\-][A-Fa-f0-9]{4}[\-]([A-Fa-f0-9]){12}/gi)

测试工作正常,但是如何在之后提取GUID并将其用作perl脚本中的字符串? []运算符不起作用......

感谢您的帮助, -G。

2 个答案:

答案 0 :(得分:1)

使用组:

my $guid =($myline =~ m/([A-Fa-f0-9]{8}[\-][A-Fa-f0-9]{4}[\-][A-Fa-f0-9]{4}[\-][A-Fa-f0-9]{4}[\-]([A-Fa-f0-9]){12})/gi)
# note parens    here __^                                                                      and         here __^

您还可以简化正则表达式:

my $guid =($myline =~ m/([a-f\d]{8}-[a-f\d]{4}-[a-f\d]{4}-[a-f\d]{4}-([a-f\d]){12})/gi)

根据daxim的评论,您需要添加a修饰符:

my $guid =($myline =~ m/([a-f\d]{8}-[a-f\d]{4}-[a-f\d]{4}-[a-f\d]{4}-([a-f\d]){12})/gia)

或使用

my $guid =($myline =~ m/([[:xdigit:]]{8}-[[:xdigit:]]{4}-[[:xdigit:]]{4}-[[:xdigit:]]{4}-([[:xdigit:]]){12})/gia)

答案 1 :(得分:1)

my $myline = "  set whatevervariable = \'aaaaaaaa-bbbb-cccc-1234-aaaaaaaabbbb\'";                                 
my ($guid) =($myline =~ m/([A-Fa-f0-9]{8}[\-][A-Fa-f0-9]{4}[\-][A-Fa-f0-9]{4}[\-][A-Fa-f0-9]{4}[\-][A-Fa-f0-9]{12})/gi);

有两处变化:

  1. 你的错误。
  2. 当你这样做时:$variable = $some_other =~ m/.../g; - the $variable will contain number of matches. If you want the match, you should do:我的($ variable)= ...`。如果文件中实际有多个guid的更改,请使用:my @guids = $ myline = ~m /.... / g;
  3. 此外 - 由于你使用的是// i flag,因此无需使用[A-Fa-f] - 简单的[a-f]就足够了。更重要的是 - 你不必做[ - ]事情。 - regexps中的角色并不神奇。

    这一切总结为:

    my @guids = $myline =~ m/([a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12})/gi;