2012-09-23 100 views
2

我有一個字符串,它代表了xml的一部分。C#正則表達式替換字符串只在標籤外

string text ="word foo<tag foo='a' />another word " 

我需要替換此字符串中的特定字詞。所以我用這個代碼:

Regex regex = new Regex("\\b" + co + "\\b", RegexOptions.IgnoreCase); 
return regex.Replace(text, new MatchEvaluator(subZvyrazniStr)); 
static string  subZvyrazniStr(Match m) 
    { 
     return "<FtxFraze>" + m.ToString() + "</FtxFraze>"; 
    } 

但我的代碼的問題是,它也取代裏面的標籤,這是我不希望的字符串。那麼我應該添加什麼來替換標籤之外的單詞呢?

例:當我設置變量共同爲「富」我想回到"word <FtxFraze>foo</FtxFraze><tag foo='a' />another word"

感謝

+0

你不應該嘗試的正則表達式解析或修改XML如果XML結構是相關的。 [請參閱。](http://stackoverflow.com/a/1732454/1633117)改爲使用XML分析器。然後,您可以將Regex代碼僅應用於文本節點。 –

+0

我知道,但在這種情況下,我有很多的節點,我不知道確切的結構,所以我認爲這是更快,更容易做到這一點與正則表達式 – david

回答

5

像這樣的簡單的技巧可能在一些就足夠了如果你不是那麼挑剔:

\bfoo\b(?![^<>]*>) 
+0

'[^ <>]'應該是'[^ <]'..不需要'>' – Anirudha

+0

您能解釋一下這個正則表達式嗎? – david

+0

@Airirha,'>'幫助正則表達式引擎更快地找到匹配,否則它需要回溯。 (這取決於引擎以及它是如何優化的) – Qtax

0

試試這個正則表達式:

Regex r = new Regex(@"\b" + rep + @".*?(?=\<)\b", RegexOptions.IgnoreCase); 
+0

這匹配''foo 酒吧''in foo 酒吧「'和''橄欖球」'在'「橄欖球」'。對這份工作而言,不情願的量詞「*。*?」太弱了;你需要主動排除像@Qtax那樣的'<'。而你必須在預見之內這麼做,所以你只會使用foo這個詞。 –

1

這就是你想要的

(?<!\<[\w\s]*?)\bfoo\b(?![\w\s]*?>) 

工作here

我已經回答了相關的問題here