2010-05-06 81 views
1

我有一個像
Pakistan, officially the <a href="Page.aspx?Link=Islamic Republic of Pakistan">Islamic Republic of Pakistan</a>我怎樣才能避免被Regex.replace被替換特定的字符串模式()

字符串現在我使用
System.Text.RegularExpressions.Regex.Replace(inputText, "(\\bPakistan\\b)", "something"); 取代巴基斯坦的標籤之外。但我不想取代<a></a>標籤內發生的巴基斯坦。
編輯:實際串

巴基斯坦(烏爾都語:پاکستان),正式 巴基斯坦伊斯蘭共和國,是一個南亞國家 。它有一個 1046公里(650英里)的海岸線 沿阿拉伯海和阿曼 灣位於南側,被 阿富汗和伊朗在西部遠 東北接壤, 印度東部和中國。 [6]塔吉克斯坦也位於 非常接近巴基斯坦,但是被 分隔的狹窄Wakhan 走廊。


和字符串

string[] links={"Pakistan","Islamic Republic","Republic of Pakistan","South Asia","Arabian Sea","Gulf","Oman","Gulf of Oman","the south","in the south","Afghanistan","Iran","the west","in the west","west India","the east","China","Tajikistan","the narrow","Wakhan Corridor","Central Asia","the Middle","Middle East","the Middle East"} 

我想<a href="page.aspx?link=thisString">thisString</a>替換該陣列中的每個字符串的每次出現的數組。而且我無法正確地添加鏈接到「巴基斯坦共和國」這樣的字符串,巴基斯坦也是這個陣列中的另一個字符串。

回答

1

雖然@克里斯解決方案不工作完全在這裏,但你可以以這種方式使用。

string content = "Pakistan is <a href=\" Pakistan is\">Pakistan an islamic country</a>"; 
string content2= Regex.Replace(content,@"\bPakistan\b", "India"); 
string content3 = Regex.Replace(content2, @"(?<=\<\s*a[^<]+)\bIndia\b(?=.*?\>)", "pakistan");   
Console.WriteLine(content3);  

但這不是一個非常有效的解決方案。

+0

可能效率不高,但易於理解和實施。謝謝 – 2010-05-06 12:18:12

+0

我這樣用它inputText = Regex.Replace(inputText,@「(?<= \ <\ s * a [^ <] +)\ bStringToReplace \ b(?=。*?\>)」,「DBPT 「); inputText = System.Text.RegularExpressions.Regex.Replace(inputText,「(\\ bStringtoReplace \\ b)」,Replacement); inputText = Regex.Replace(inputText,@「(?<= \ <\ s * a [^ <] +)\ bDBPT \ b(?=。*?\>)」,StringtoReplace) – 2010-05-06 12:59:51

2

如果您嘗試在HTML語法環境中執行某些操作,請使用HTML解析器。

0

獲取文本的每一行轉換成字符串A

刪除<a></a>之間的位,並將其存儲在字符串B

運行在剩餘的文本您Regex字符串A

回報A + B

+0

的位置標籤將丟失。 – 2010-05-06 10:23:22

+0

不,不需要顯示簡單的代碼示例以及一些清晰的示例數據。 – 2010-05-06 10:47:20

+0

你是對的,它不會。但''不一定出現在最後,並且有多於一個的'塊'。 – 2010-05-06 10:56:21

1

下面是你如何做與你所要求的相反的內容(只替換標籤內的實例):

content = Regex.Replace(content, @"(?<=\<\s*a[^>]+)\bPakistan\b(?=.*?\>)", "India"); 

這是非常未經測試的,不是你想要的,但它可以給你一些提示。這使用zero-width lookaround assertions。我相信還有很多其他的方法可以做到這一點。

這真的是在推動正則表達式的極限。你應該使用一個HTML解析器。

編輯:使用負回顧後,這似乎工作(請測試一下吧!):

content = Regex.Replace(content, @"(?<!\<\s*a[^>]+)\bPakistan\b", "India"); 
+0

C#正則表達式是否允許在負向lookbehinds中使用可變寬度表達式?大多數支持lookbehinds的正則表達式引擎不允許使用可變寬度的表達式(因爲不知道多長時間才能嘗試匹配它們)。 – Amber 2010-05-06 10:43:35

+0

我對「零寬度」的潛在缺陷理解是它意味着這個斷言沒有被捕獲。 http://msdn.microsoft.com/en-us/library/bs2twtah.aspx#sectionToggle8上的.NET正則表達式示例似乎使用可變寬度表達式:「(?<!(Saturday | Sunday))\ b \ w + \ d {1,2},\ d {4} \ b「(週六/週日輪換)。 – 2010-05-06 11:03:22

+0

@Dav:.NET在正則表達式中幾乎是獨一無二的,因爲您可以在lookbehind內使用任何您喜歡的表達式。 @Chris:說一個零寬度的斷言(比如lookbehind)*消耗*什麼都沒有更正確。捕獲是另一回事。 – 2010-05-06 12:37:48

2

對於你的問題的第一部分,我將匹配要麼鏈接目標詞:

Regex r = new Regex(@"<a\s+.*?</a>|\bPakistan\b"); 

然後我會用MatchEvaluator檢查哪一個我匹配和相應的更換:如果是鏈接,請將其重新插入;如果它是目標詞,則將其鏈接起來。

對於第二部分,你可以Join數組中的字符串成一個正則表達式的交替,就像這樣:

string regex = String.Format(@"\b({0})\b", String.Join("|", links)); 

只要記住,交替返回第一個匹配的替代,而不是最長的。如果任何替代是替代的前綴,應之前列出。例如,the Middle East應該在列表中的the Middle之前。

相關問題