我可以从一组哈希键构建Perl Regex

 徐韵茜YUNXI 发布于 2023-01-18 16:26

(与上一个问题相关:我是否需要重置Perl哈希索引?)

我有一个来自文件的哈希,其定义如下:

%project_keys = (
    cd     => "continuous_delivery",
    cm     => "customer_management",
    dem    => "demand",
    dis    => "dis",
    do     => "devops",
    sel    => "selection",
    seo    => "seo"
);

我需要检查评论标题是否具有正确的格式,如果是,请链接到单独的URL.

例如,如果评论标题是

"cm1234 - Do some CM work"

然后我想链接到以下URL:

http://projects/customer_management/setter/1234

目前,我正在使用以下(硬编码)正则表达式:

if ($title =~ /(cd|cm|dem|dis|do|sel|seo)(\d+)\s.*/) {
    my $url = 'http://projects/'.$project_keys{$1}.'/setter/'.$2
}

但显然我想从散列键本身构建正则表达式(上面的散列示例会相当频繁地更改).我想过简单地按键连接键如下:

# Build the regex
my $regex = '';
foreach my $key ( keys %project_keys ) {
    $regex += $key + '|';
}
$regex = substr($regex, 0, -1); # Chop off the last pipe
$regex = '('.$regex.')(\d+)\s.*';
if ($title =~ /$regex/) {
    my $url = 'http://projects/'.$project_keys{$1}.'/setter/'.$2
}

但是a)它没有按照我的意愿工作,并且b)我认为有更好的Perl方法来做到这一点.还是有吗?

1 个回答
  • 您的主要问题来自尝试使用+连接字符串.它不是在字符串连接运算符Perl中那样做的..但是,使用字符串连接的循环通常可以更好地完成join.

    我会建议:

    my $project_match = join '|', map quotemeta, keys %project_keys;
    
    if ($title =~ /($project_match)(\d+)\s/) {
       my $url = 'http://projects/'.$project_keys{$1}.'/setter/'.$2;
       # Something with $url
    }
    

    quotemeta是一个函数,它可以转义字符串中出现的任何正则表达式元字符.在您的示例中没有任何内容,但最好始终使用它并避免意外错误.

    .*在你的模式中遗漏了尾随,因为如果你实际上没有对这些东西做任何事情,就没有必要说"然后有些东西,或者说没有东西".除非将其锚定到字符串的开头和结尾,否则模式不需要匹配整个字符串.

    2023-01-18 16:28 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有