【问题标题】:Using multiple Perl regular expressions to find and replace使用多个 Perl 正则表达式查找和替换
【发布时间】:2016-10-29 14:49:54
【问题描述】:

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

我需要处理包含 Foo Bar1.jpg 等占位符行的文本文件,并将其替换为相应的 URL,例如 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。匹配成功后,我想用https:/baz/qux/Foo_Bar1.jpg 替换Foo Bar1.jpg 行。

最终,我想对每个排列都这样做,以便 https:/baz/qux/Foo_Bar2.jpg 也替换 Foo Bar2.jpg 等等。

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

但是,尽管过去一周我花了很多时间阅读 Stack Overflow、其他各种网站和 O'Reilly 关于 Pearl 和 Pearl 正则表达式的书籍,但我无法思考如何处理我能找到什么。

【问题讨论】:

标签: regex perl


【解决方案1】:

我认为您缺少的部分是使用 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,您可能还想插入错误/警告消息。

【讨论】:

  • 非常感谢,杰夫。不幸的是,当我运行代码时,while (my $key 行上出现Use of uninitialized value $_ in pattern match 错误。我想你没有任何想法?
  • @BeingClever 是的。如前所述,while 需要嵌套在“html”文件上的 I/O 循环中:while (&lt;&gt;) { ... 或类似文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-22
  • 1970-01-01
  • 2018-09-20
  • 1970-01-01
  • 1970-01-01
  • 2017-08-28
  • 1970-01-01
相关资源
最近更新 更多