gpt4 book ai didi

regex - 如何从 Perl 正则表达式匹配中获得多个内存?

转载 作者:行者123 更新时间:2023-12-04 22:53:46 24 4
gpt4 key购买 nike

正则表达式搜索的目的是从 C++ 头文件中确定所有模板类实例。可以对类实例进行格式化,例如:

CMyClass<int> myClassInstance;

CMyClass2<
int,
int
> myClass2Instacen;

通过将整个文件加载到字符串中来执行搜索:
open(FILE, $file);
$string = join('',<FILE>);
close(FILE);

即使类实例跨越字符串中的多于一行,以下正则表达式也用于确定类实例:
$search_string = "\s*\w[^typename].*<(\s*\w\s*,?\n?)*)>\s*\w+.*";
$string =~ m/$search_string/;

问题是即使文件中存在更多类实例,搜索也只返回一个命中。

是否可以通过使用此方法从正则表达式反向引用变量之一获得所有命中?

最佳答案

首先,如果你要吞食文件,你应该使用 File::Slurp .然后你可以这样做:

my $contents = read_file $file;

read_file 会出错。

其次, [^typename] 不仅排除字符串 'typename',还排除包含任何这些字符的任何字符串。除此之外,您使用的模式是否会始终匹配您希望它匹配的内容对我来说并不明显,但我现在无法对此发表评论。

最后,要一一获取文件中的所有匹配项,请在循环中使用 g 修饰符:
my $source = '3 5 7';

while ( $source =~ /([0-9])/g ) {
print "$1\n";
}

现在我有机会看看你的模式,我仍然不确定 [^typename] 是什么,但这里有一个示例程序,它捕获尖括号之间的部分(因为这似乎是唯一的你在上面捕获的东西):
use strict;
use warnings;

use File::Slurp;

my $pattern = qr{
^
\w+
<\s*((?:\w+(?:,\s*)?)+)\s*>
\s*
\w+\s*;
}mx;

my $source = read_file \*DATA;

while ( $source =~ /$pattern/g ) {
my $match = $1;
$match =~ s/\s+/ /g;
print "$match\n";
}

__DATA__
CMyClass<int> myClassInstance;

CMyClass2<
int,
int
> myClass2Instacen;

C:\Temp> t.pl
int
int, int

现在,我怀疑您更喜欢以下内容:
my $pattern = qr{
^
(
\w+
<\s*(?:\w+(?:,\s*)?)+\s*>
\s*
\w+
)
\s*;
}mx;

产生:
C:\Temp> t.pl
CMyClass<int> myClassInstance
CMyClass2< int, int > myClass2Instacen

关于regex - 如何从 Perl 正则表达式匹配中获得多个内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/820090/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com