2017-08-01 128 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