Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 以相反方向处理Perl qr正则表达式字符串_Regex_Perl - Fatal编程技术网

Regex 以相反方向处理Perl qr正则表达式字符串

Regex 以相反方向处理Perl qr正则表达式字符串,regex,perl,Regex,Perl,我有一系列qr//RegEx字符串模式来匹配提供给我的站点的URL。例如,qr^/safari/article/([0-9]+)\.html(\?(.*)?$。。此字符串将匹配URL的路径,如/safari/article/299.html?参数=1。我有一个单独的子例程,可以在其中创建链接到程序不同部分的URL。我突然想到,如果后一部分能够以某种方式使用我已经编写的上述模式,那就太好了——如果URL的生成方式和以后的处理方式都来自同一组模式,这将减少出错的可能性 当用户访问该站点时,我的程序会

我有一系列qr//RegEx字符串模式来匹配提供给我的站点的URL。例如,
qr^/safari/article/([0-9]+)\.html(\?(.*)?$。
。此字符串将匹配URL的路径,如
/safari/article/299.html?参数=1
。我有一个单独的子例程,可以在其中创建链接到程序不同部分的URL。我突然想到,如果后一部分能够以某种方式使用我已经编写的上述模式,那就太好了——如果URL的生成方式和以后的处理方式都来自同一组模式,这将减少出错的可能性

当用户访问该站点时,我的程序会获取提供给服务器的URL,并根据上面的字符串运行它,它会输出带有找到的模式的
$1
$2
(例如,“299”和“parameter=1”,加载页面的两个参数)。本质上,现在我想反过来做,以某种方式提供
$1
$2
,并根据qr//字符串输入它们,以创建一个新的路径输出(例如,我将
$1
设置为“300”,将
$2
设置为“参数=2,”以某种方式将其与qr//字符串合并,并获得输出
/safari/article/300.html?参数=2

有没有一种简单的方法来实现这种“反向正则表达式”?似乎有一种方法可以简单地将正则表达式模式与这两种插入模式进行匹配,但我觉得这有点马虎。有没有更干净的方法

编辑:将模式存储在正则表达式中的部分原因是,它们都会被放入多维数组中,以便稍后进行处理,以帮助确定应该调用哪个模块。以下是几个示例项:

 [
      { function => 'article', pattern => qr#^/safari/article/([0-9]+)\.html(\?(.*))?$#, weight => 106 },
      { function => 'topCommentedPosts', pattern => qr#^/safari/top\.html$#, weight => 100 }

 ]

我不确定我是否完全理解您想要实现的目标。以下方法可行,但这样做似乎非常脆弱和危险。无论如何,您为什么需要生成路径

#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };

my $TEMPLATE = '/safari/article/$1.html?$2';

sub generate {
    my (@replacements) = @_;
    return $TEMPLATE =~ s/\$([12])/$replacements[$1-1]/gr
}

sub match {
    my ($string) = @_;
    my $regex = "$TEMPLATE";
    $regex =~ s/([?.])/\\$1/g;
    $regex =~ s/\$[0-9]+/(.*)/g;
    return $string =~ /$regex/
}

use Test::More;

is generate(300, 'parameter=2'), '/safari/article/300.html?parameter=2';

is_deeply [match('/safari/article/299.html?parameter=1')], [299, 'parameter=1'];

done_testing();

谢谢,@choroba。基本上,我的目标是能够改变程序中不同功能的请求方式,因为这个程序在多个不同的网站上使用。例如,我可能希望所有文章“/safari/”和“.html”结尾都在一个网站上,而“/foobar/”结尾都是“.arbitral”另一个上的扩展。一组正则表达式模式匹配字符串可以使输入端轻松自定义。但是,当输出页面时,这些页面也需要使用可自定义格式以规范的方式链接到同一站点上的其他资源。我想知道我是否可以接受您的概念,但将模板作为整个正则表达式x字符串,而不是在匹配函数中替换$1和$2?现在我有一个完整的模式列表,这些模式调用不同的模块,所有模块都放在一个数组中。我将在我的原始问题中添加该数组的格式。也许一个好的方法是,这就像gameshow Jeopardy!如果我有答案,我有正则表达式,我可以回到“问题”?或者换一种说法,“42”。。。