[英]Using multiple Perl regular expressions to find and replace
我是一个需要你专业知识的Perl和正则表达新手。
我需要处理包含Foo Bar1.jpg
等占位符行的文本文件,并将其替换为https:/baz/qux/Foo_Bar1.jpg
等相应的URL。
您可能已经猜到了,我正在使用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匹配的正则表达式。 据我所知,这不是我的问题。 我可以找到我需要处理的字符串。 例如,/ [ /[az]+\\s([a-z0-9]+)\\.jpg/
成功匹配我所谓的占位符文本并捕获我称之为区分符的内容。
然而,虽然过去一周我花了一些令人尴尬的小时阅读Stack Overflow,其他各种网站以及关于珍珠和珍珠正则表达式的O'Reilly书籍,但我无法理解如何处理我能做的事情。找。
我认为你缺少的是使用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
您可能还想插入错误/警告消息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.