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

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

发布时间:2020-12-16 06:23:26 所属栏目:大数据 来源:网络整理
导读:(与上一个问题相关: Do I need to reset a Perl hash index?) 我有一个来自文件的哈希,其定义如下: %project_keys = ( cd = "continuous_delivery",cm = "customer_management",dem = "demand",dis = "dis",do = "devops",sel = "selection",SEO = "SEO");
(与上一个问题相关: Do I need to reset a Perl hash index?)

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

%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,-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方法来做到这一点.还是有吗?

解决方法

您的主要问题来自尝试使用连接字符串.在Perl中没有这样做,字符串连接运算符是..但是,通过连接,通常可以更好地完成具有字符串连接的循环.

我会建议:

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

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

(编辑:李大同)

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

    推荐文章
      热点阅读