使用多个Perl正则表达式查找和替换

时间:2016-06-27 14:25:51

标签: regex perl

我是一名需要您专业知识的Perl和正则表达新手。

我需要处理包含Foo Bar1.jpg等占位符行的文本文件,并将其替换为https:/baz/qux/Foo_Bar1.jpg等对应的网址。

正如您可能已经猜到的那样,我正在使用HTML。占位符文本引用文件名,这是编写文档时唯一可用的文件。这就是我必须使用占位符文本的原因。最后,当然,我想用URL替换文件名(在我将文件上传到CMS以获取URL之后)。那时,我掌握了所有信息 - 文件名和URL。当然,我可以将URL粘贴到HTML文档中的占位符名称上。事实上,我已经做到了。但我确信有更好的方法。

简而言之,我有这样的占位符行:

Foo Bar1.jpg
Foo Bar2.jpg
Foo Bar3.jpg

我也有这样的URL行:

https:/baz/qux/Foo_Bar1.jpg
https:/baz/qux/Foo_Bar2.jpg
https:/baz/qux/Foo_Bar3.jpg

我想找到占位符字符串并使用正则表达式捕获Bar1之类的区分符。然后我想使用像Bar1这样的捕获部分来执行另一个匹配相应URL字符串部分的正则表达式搜索,即https:/baz/qux/Foo_Bar1.jpg。成功匹配后,我想将Foo Bar1.jpg行替换为https:/baz/qux/Foo_Bar1.jpg

最终,我希望为每个排列做到这一点,以便https:/baz/qux/Foo_Bar2.jpg也替换Foo Bar2.jpg等等。

我编写了与占位符和URL匹配的正则表达式。据我所知,这不是我的问题。我可以找到我需要处理的字符串。例如,/[a-z]+\s([a-z0-9]+)\.jpg/成功匹配我所称的占位符文本,并捕获我称之为区分符的内容。

然而,虽然过去一周我花了一些令人尴尬的小时阅读Stack Overflow,其他各种网站以及关于珍珠和珍珠正则表达式的O'Reilly书籍,但我无法理解如何处理我能找到什么。

1 个答案:

答案 0 :(得分:0)

我认为您缺少的部分是使用Perl的内部grep函数,根据您称之为“差异化因素”的内容搜索URL行列表。

将您的URL行插入到Perl数组中(假设它们有一个有限的可管理数量,因此内存不会被破坏):

open URLS, theUrlFile.txt or die "Cannot open.\n";
my @urls = <URLS>;

然后在包含“占位符”的文件的循环中:

while (my $key = /[a-z]+\s([a-z0-9]+)\.jpg/g) {
  my @matches = grep $key, @urls;
  if (@matches) {
    s/[a-z]+\s$key\.jpg/$matches[0]/;
  }
}

如果@matches != 1,您可能还想插入错误/警告消息。