加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

如何从Perl正则表达式匹配中获得多个记忆?

发布时间:2020-12-15 23:23:01 所属栏目:大数据 来源:网络整理
导读:正则表达式搜索的目的是确定C头文件中的所有模板类实例.类实例可以形成如下: CMyClassint myClassInstance;CMyClass2int,int myClass2Instacen; 通过将整个文件加载到字符串中来执行搜索: open(FILE,$file);$string = join('',FILE);close(FILE); 以下正则
正则表达式搜索的目的是确定C头文件中的所有模板类实例.类实例可以形成如下:

CMyClass<int> myClassInstance;

CMyClass2<
int,int
> myClass2Instacen;

通过将整个文件加载到字符串中来执行搜索:

open(FILE,$file);
$string = join('',<FILE>);
close(FILE);

以下正则表达式用于确定类实例,即使类实例跨越字符串中的多行:

$search_string = "s*w[^typename].*<(s*ws*,?n?)*)>s*w+.*";
$string =~ m/$search_string/;

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

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

解决方法

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

my $contents = read_file $file;

read_file会出错.

其次,[^ typename]不排除字符串’typename’,也不排除包含任何这些字符的任何字符串.除此之外,对我来说,使用的模式将始终与您希望匹配的内容相匹配,这一点并不明显,但我现在无法对此发表评论.

最后,要逐个获取文件中的所有匹配项,请在循环中使用g修饰符:

my $source = '3 5 7';

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

既然我有机会看看你的模式,我仍然不确定要做什么[^ 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 "$matchn";
}

__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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读