如何在Perl中保存正则表达式的匹配部分?

时间:2009-09-16 10:45:33

标签: regex perl

我想整理以下文本文件中的所有API:

DLL Name: msvcrt.dll
...
DLL Name: msvcrt.dll
...
DLL Name: KERNEL32.dll
...
DLL Name: WSOCK32.DLL

我想到了像

这样的东西
$infostring = lc($infostring);
while ($infostring =~ /dll name:/g)
{
 print "found dll\n";
}

唯一的问题是,如何获取实际的dll名称或至少找到找到的字符串的位置?

2 个答案:

答案 0 :(得分:9)

您需要扩展正则表达式以捕获DLL的名称:

$infostring = lc($infostring);
while ($infostring =~ /dll name: (\S+\.dll)/g) {
  print "found dll: $1\n";
}

\S+\.dll将匹配一个或多个非空白字符,后跟“.dll”,括号将收集其中匹配的文本并将其存储在变量$1中。 (如果您有多组括号,第二组将进入$2,第三组将进入$3等。)

编辑:在编写我的答案时,看起来输入规范是通过对问题的编辑而改变的...上面将是包含所有DLL名称的单个输入字符串。在新格式下,每个格式都在一个单独的行上,您需要使用:

while (my $infostring = <$input_filehandle>) {
  $infostring = lc($infostring);
  print "found dll: $1\n" if $infostring =~ /dll name: (\S+\.dll)/;
}

如果一行中没有多个匹配项,则无需在正则表达式上混淆/g或循环匹配。

答案 1 :(得分:1)

while ($infostring =~ /DLL Name: (.*)/g)
{
    print "found dll: $1\n";
}

请阅读perlre手册页。您需要使用捕获组(用括号表示)来捕获DLL的名称。然后,您可以使用$1$2,...,$n

来引用这些捕获