Perl,用string替换多个匹配项

时间:2017-08-01 01:53:22

标签: regex perl

所以,我正在解析XML,并遇到了问题。 XML包含包含脚本的对象,其中包含以下内容:

return [
['measurement' : org.apache.commons.io.FileUtils.readFileToByteArray(new File('tab_2_1.png')),
'kpi' : org.apache.commons.io.FileUtils.readFileToByteArray(new File('tab_2_2.png'))]]

我需要替换所有文件名,保存文件格式,regexp模板的每个条目,因为字符串看起来像这样:

['measurement' : org.apache.commons.io.FileUtils.readFileToByteArray(new File('tab_2_1.png'))('tab_2_1.png'))('tab_2_1.png')),

我还需要在image_name

之前替换所有.png

我使用了这个正则表达式:.*\(\'(.*)\.png\'\), 但它只捕获\n之前的最后一个匹配,而不是整个字符串。

你可以帮我纠正这个正则表达式吗?

1 个答案:

答案 0 :(得分:2)

问题是.*贪婪:它匹配所有。因此.*x匹配字符串中最后一个x的所有内容,即使所有内容都包含x s。你需要非贪婪的

s/\('(.*?)\.png/('$replacement.png/g;

?使.*与第一个.png匹配。需要\('来适当地将模式划分为文件名。这正确地替换了所示示例中的文件名。

另一种方法是\('([^.]*)\.png,其中[^.]否定字符类,匹配任何 a {{1} }}。使用.量词,它会再次匹配第一个*

问题并未说明你是如何“解析XML ”但我非常希望它与XML::LibXML XML::Twig之类的库一样。请不要尝试使用正则表达式。该工具并不完全适合这项工作,您将了解它。关于这一点已经写了很多,搜索SO。