0

我在测试和成功从文本文件的一行中提取 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。

4

2 回答 2

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)
于 2013-06-17T11:14:48.560 回答
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;

此外 - 由于您使用的是 //i 标志,因此无需使用 [A-Fa-f] - 简单的 [af] 就足够了。更重要的是 - 你不必做 [-] 的事情。- 字符在正则表达式中并不神奇。

这一切总和为:

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;
于 2013-06-17T11:16:02.470 回答