嘗試解析某些OpenXML標準(docx)時遇到問題。我們使用如{Contact.MailAddress}
這樣的表達式,並在第二步中從數據中填充此表達式。但是,那樣的話(和LibreOffice)是,是,他們有時分頭這些標籤是這樣的:試圖解析XML時的失控回溯
<w:r w:rsidRPr="00E22BCD">
<w:rPr>
<w:rFonts w:eastAsia="Times New Roman"/>
<w:lang w:val="fr-CH"/>
</w:rPr>
<w:t>{</w:t>
</w:r>
<w:proofErr w:type="spellStart"/>
<w:r w:rsidRPr="00E22BCD">
<w:rPr>
<w:rFonts w:eastAsia="Times New Roman"/>
<w:lang w:val="fr-CH"/>
</w:rPr>
<w:t>Contakt.MailAddress</w:t>
</w:r>
<w:proofErr w:type="spellEnd"/>
<w:r w:rsidRPr="00E22BCD">
<w:rPr>
<w:rFonts w:eastAsia="Times New Roman"/>
<w:lang w:val="fr-CH"/>
</w:rPr>
<w:t>}</w:t>
</w:r>
所以,我提出以下的正則表達式:
(?<expr>{)((?<tag><[^>]+>)|(?<expr>[\w\s.]+))+(?<expr>})
在expr
組萬事部分{Contact.MailAddress}
表達式並被合併在一起。 tag
組中的所有內容都會被合併到標籤中,以便稍後將xml修復。
現在,這工作得很好。但是,當我們使用{foreach}語法時,xml可能會變得相當大,然後我們會遇到失控的情況。
任何人都可以想到一個正則表達式,它可以更好地捕獲這個並不會導致失控?
編輯1:該程序是用C#/。NET編寫的。對於正則表達式的味道。
編輯2:我花了另一種方法:我上市,其中有一個匹配的所有比賽一樣{[^}]}
並在那裏,我什麼也沒有取代所有的標籤和空格:
var matches = Regex.Matches(xml, @"{[^}]+}")
.Cast<Match>()
.OrderByDescending(x => x.Index)
.ToList();
foreach (var match in matches)
{
var replacement = Regex.Replace(match.Value, @"<[^>]+>", "");
replacement = Regex.Replace(replacement, @"\s+", "");
xml = xml.Substring(0, match.Index) + replacement + xml.Substring(match.Index + match.Length);
}
關鍵是要訂購比賽通過索引降低,所以在Substring
工作的數學。
http://stackoverflow.com/a/1732454/1030675 – choroba
你的正則表達式的風格是什麼? – Stephan
@Stephan C#/ .NET – LueTm