2017-08-01 43 views
0

所以,我解析XML,并得到了一个问题。 XML具有包含脚本的对象,看起来大约是:Perl,替换字符串中的多个匹配

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'))]] 

我需要替换所有文件名,保存的文件格式,正则表达式模板的每个条目,因为字符串可以看起来像:

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

和我还需要之前.png

我用这个正则表达式替换所有image_name.*\(\'(.*)\.png\'\), 但它只能检测的最后一场比赛中一行\n之前,没有谁le字符串。

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

+0

你需要用什么名字替换?我认为它是从现有名称动态派生的东西,而不是所有的固定字符串? – zdim

回答

2

问题是.*是贪婪的:它匹配的一切它可以。因此,.*x全部匹配到字符串中最后一个x,即使所有包含x s。您需要非贪婪

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

其中?使得.*匹配到第一.png。需要\('才能将模式适当地分隔为文件名。这正确地替换了所示示例中的文件名。

另一种方式做,这是\('([^.]*)\.png,其中[^.]否定字符类,匹配任何是一个.。随着*量词再次全部到第一.png


的问题不说,你究竟怎么了“解析XML”但我真希望这是一个像的XML::TwigXML::LibXML库相匹配。请不要试图用正则表达式。这个工具对于这项工作来说是不够的,你会了解它的。关于这一点已经写了很多年了,搜索SO。

+0

是的,这很好,谢谢 – genesi5