如何在Perl中找到正则表达式匹配项的位置?

如何在Perl中找到正则表达式匹配项的位置?

How can I find the location of a regex match in Perl?

我需要编写一个接收字符串和正则表达式的函数。 我需要检查是否有匹配项,并返回匹配项的开始和结束位置。 (正则表达式已由qr//编译。)

该函数可能还会收到"全局"标志,然后我需要返回所有匹配项的(开始,结束)对。

我不能更改正则表达式,甚至不能在其周围添加(),因为用户可能会使用()\\1。 也许我可以使用(?:)

示例:给定" ababab"和正则表达式qr/ab/,在全局情况下,我需要取回3对(开始,结束)。


内置变量@-@+分别保存上一次成功匹配的开始和结束位置。 $-[0]$+[0]对应于整个模式,而$-[N]$+[N]对应于$N($1$2等)子匹配。


忘记我以前的帖子,我有个更好的主意。

1
2
3
4
5
6
7
8
9
10
11
12
13
sub match_positions {
    my ($regex, $string) = @_;
    return if not $string =~ /$regex/;
    return ($-[0], $+[0]);
}
sub match_all_positions {
    my ($regex, $string) = @_;
    my @ret;
    while ($string =~ /$regex/g) {
        push @ret, [ $-[0], $+[0] ];
    }
    return @ret
}

此技术不会以任何方式更改正则表达式。

编辑添加:引用perlvar上$ 1 .. $ 9。"这些变量都是只读的,并且动态地作用于当前的块。" 换句话说,如果要使用$ 1 .. $ 9,则不能使用子例程进行匹配。


pos函数为您提供比赛的位置。 如果将正则表达式放在括号中,则可以使用length $1来获取长度(并以此结尾)。 像这样

1
2
3
4
5
6
7
8
9
10
11
12
13
sub match_positions {
    my ($regex, $string) = @_;
    return if not $string =~ /($regex)/;
    return (pos($string), pos($string) + length $1);
}
sub all_match_positions {
    my ($regex, $string) = @_;
    my @ret;
    while ($string =~ /($regex)/g) {
        push @ret, [pos($string), pos($string) + length $1];
    }
    return @ret
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/usr/bin/perl

# search the postions for the CpGs in human genome

sub match_positions {
    my ($regex, $string) = @_;
    return if not $string =~ /($regex)/;
    return (pos($string), pos($string) + length $1);
}
sub all_match_positions {
    my ($regex, $string) = @_;
    my @ret;
    while ($string =~ /($regex)/g) {
        push @ret, [(pos($string)-length $1),pos($string)-1];
    }
    return @ret
}

my $regex='CG';
my $string="ACGACGCGCGCG";
my $cgap=3;    
my @pos=all_match_positions($regex,$string);

my @hgcg;

foreach my $pos(@pos){
    push @hgcg,@$pos[1];
}

foreach my $i(0..($#hgcg-$cgap+1)){
my $len=$hgcg[$i+$cgap-1]-$hgcg[$i]+2;
print"$len\
"
;
}

如果您希望程序中所有RE的执行速度较慢,也可以使用不推荐使用的$`变量。 从perlvar:

1
2
3
4
5
6
   $‘      The string preceding whatever was matched by the last successful pattern match (not
           counting any matches hidden within a BLOCK or eval enclosed by the current BLOCK).
           (Mnemonic:"`" often precedes a quoted string.)  This variable is read-only.

           The use of this variable anywhere in a program imposes a considerable performance penalty
           on all regular expression matches.  See"BUGS".


推荐阅读

    linux调用函数的命令?

    linux调用函数的命令?,系统,代码,策略,上调,时间,设计,通信,网络,设备,项目,

    linux命令和库函数?

    linux命令和库函数?,系统,标准,管理,地址,服务,库函数,环境,平台,第一,状态,1

    linux检查硬盘的命令?

    linux检查硬盘的命令?,系统,信息,检测,情况,命令,工具,电脑,地址,设备,硬盘,l

    字符串查找命令linux?

    字符串查找命令linux?,系统,字符串,工具,信息,文件,命令,字符,选项,文本,范

    linux命令替换字符串?

    linux命令替换字符串?,字符串,文件,批量,首次,数据,命令,内容,方法,用字,结

    linux查看函数命令?

    linux查看函数命令?,系统,信息,名称,命令,位置,情况,公用,名字,标准,资料,lin

    linux内置命令位置?

    linux内置命令位置?,工作,系统,信息,地址,位置,标准,命令,目录,密码,名字,Lin

    linux检查挂载命令?

    linux检查挂载命令?,设备,系统,信息,情况,状态,服务,软件,命令,磁盘,网络,lin

    linux拼接字符串命令?

    linux拼接字符串命令?,系统,工作,代码,工具,名称,信息,地址,时间,数据,命令,l

    linux命令防火墙位置?

    linux命令防火墙位置?,系统,服务,软件,密码,状态,位置,防火墙,工具,公共,设

    添加字符串命令linux?

    添加字符串命令linux?,情况,名称,文件,位置,名字,地方,连续,信息,命令,内容,L

    linux一般检查命令?

    linux一般检查命令?,网络,系统,检测,情况,工作,信息,命令,进程,时间,设备,lin

    检查硬件linux命令?

    检查硬件linux命令?,信息,系统,第一,数据,设备,检测,命令,情况,灵活,实时,如

    调用函数命令linux?

    调用函数命令linux?,系统,管理,网络,通用,统一,观察,地址,代码,设备,地方,怎

    检查路由命令linux?

    检查路由命令linux?,网络,地址,系统,信息,工具,电脑,时间,通信,服务,命令,lin

    linux命令查找字符串?

    linux命令查找字符串?,工具,信息,命令,字符串,系统,工作,文件,范本,样式,文

    linux光标位置命令?

    linux光标位置命令?,位置,光标,时间,系统,状态,终端,命令,程序,文件,菜单,lin

    linux数据库检查命令?

    linux数据库检查命令?,服务,状态,地址,位置,系统,信息,命令,工作,情况,密码,

    linux分区检查命令是?

    linux分区检查命令是?,系统,设备,工具,管理,情况,信息,检测,分区,密码,单位,

    linux检查流量的命令?

    linux检查流量的命令?,工具,系统,实时,状态,网络,信息,数据,密码,地址,流量,l