2012-11-15 174 views
0

如何提取someXml?在兩個字符串之間提取xml作爲字符串

frame 0 
    push 'this' 
    getVariable 
    push 'g_data_1343488' 
    push ' 

    someXml' 

    setMember 
end // of frame 0 

我試圖用正則表達式,但我不成功是:

foreach (var match in Regex.Matches(file, @"(?<=push ').*(?=')")) 

問題與這一個:我不希望有爲例「g_data_1343488」或「本」被抓住。

+0

所以要最後「推」和「setMember」之間的文本? –

+0

是的!我想抓住一些XML(而不是一些XML) – graph1ZzLle

回答

1

這是一種可能性。這是一個正則表達式,試圖將單引號之間的內容識別爲XML。這不是一個完美的正則表達式。如果可以使用,它確實取決於您的要求。正則表達式越精確,閱讀越難。實際上,這個表達式不會匹配所有的XML,並且也會匹配一些無效的XML。

例如,這個正則表達式將匹配名稱以數字開頭的標籤。它也會匹配XML結束標籤和屬性。你可以根據你的需要調整它。

這:

push\s+'\s*<(\w+)(?:\s+\w+=(?:"[^"]*"|'[^']*'))*>(?:[^<]+|(?!</\1>)</?\w+(?:\s+\w+=(?:"[^"]*"|'[^']*'))*\s*/?>)*</\1>\s*' 

這裏是表達的細目。推送聲明的開始:

push\s+'\s* 

檢測根XML標記並捕獲其名稱。允許那些單,雙引號分隔:

<(\w+)(?:\s+\w+=(?:"[^"]*"|'[^']*'))*> 

遍歷根標籤內的所有內部標籤和文本元素屬性。允許單引號和雙引號分隔的屬性。

(?:[^<]+|(?!</\1>)</?\w+(?:\s+\w+=(?:"[^"]*"|'[^']*'))*\s*/?>)* 

捕獲結束根標籤。

</\1>\s*' 

您也可以嘗試簡單地捕捉推命令,並通過這樣的函數在此解決方案上運行他們的價值觀: How to check for valid xml in string input before calling .LoadXml()

+0

感謝您的解釋 – graph1ZzLle

0
var allMatches = Regex.Matches(text, @"(frame.*push ')(.*?)(?='.*end)", RegexOptions.Singleline); 

foreach (Match matches in allMatches) 
{ 
    String somexml = matches.Groups[2].Value; 
} 
+0

體育。如果我們把第一組放在?<=那麼gready。*將不起作用。 –

相關問題