2010-02-11 51 views
1

如果我有輸入字符串在C#中,我該怎麼辦一系列的正則表達式/ LINQ操作就可以做一個繩子的正則表達式匹配,然後另一個正則表達式的字符串的所有作品,其不匹配由1st Regex提供。多層次的.Net正則表達式

換句話說,對於輸入字符串:

<!-- Lorem ipsum dolor sit amet, consectetur adipiscing elit --> 
<!-- The quick brown fox jumps over the lazy dog --> 
Lorem ipsum dolor sit amet, consectetur adipiscing elit 
The quick brown fox jumps over the lazy dog 
<!-- Lorem ipsum dolor sit amet, consectetur adipiscing elit --> 
<!-- The quick brown fox jumps over the lazy dog --> 
Lorem ipsum dolor sit amet, consectetur adipiscing elit 
The quick brown fox jumps over the lazy dog 

我想用regex1的與<!-- -->匹配的線條和他們做一些操作,而不會進一步解析他們。讓Regex2匹配與Regex1不匹配的字符串,例如在這些行中查找所有單詞「fox」和「dog」,並對這些單詞執行某些操作。

什麼是正則表達式/ LINQ操作在像這樣的情況結合起來的最佳方式?

回答

1

因爲.NET支持可變長度lookbehind,所以你很幸運。

因此,您可以按順序使用兩個正則表達式。

首先,使用

^<!--(.*)-->\s*$ 

找到所有註釋行。反向引用$1將包含分隔符之間的任何內容。例如:

Regex paragraphs = new Regex(@"^<!--(.*)-->\s*$", RegexOptions.Multiline); 
Match matchResults = paragraphs.Match(subjectString); 
while (matchResults.Success) { 
    // matched text: matchResults.Value 
    // match start: matchResults.Index 
    // match length: matchResults.Length 
    matchResults = matchResults.NextMatch(); 

其次,要找到和操作在其他行的「狗」和「狐狸」,你可以使用

(?<!^<!--.*)(dog|fox) 

什麼這個表達式的意思是「匹配dogfox除非行以<!--開頭「。所以,如果你想取代他們,比如說,通過「貓」,用

resultString = Regex.Replace(subjectString, "(?<!^<!--.*)(dog|fox)", "cat", RegexOptions.Multiline); 
+0

糾正我,如果我錯了,但在這裏,你按順序做兩次在整個輸入字符串。我想要做的是在第一個while循環以某種方式在當前和之前的匹配之間執行正則表達式,因爲它應該是兩個匹配之間的子串(第一個不匹配)。看起來我需要存儲匹配索引並基於它們獲取子字符串,並在該子字符串上執行第二個正則表達式?這樣做比按照順序做更有效嗎? 或者在第一個正則表達式(匹配和非匹配)中使用兩個正則表達式組並將非匹配組用作第二個正則表達式的輸入更好? – 2010-02-11 15:20:35

+0

第一個代碼片段收集一個匹配數組,每個匹配包含一行。第二個對整個輸入字符串進行一次替換操作。當然,在你的例子中,無論如何你都不需要第一個任務的正則表達式 - 只要找到一個以分隔符開始和結束的行。這是否與性能有關很重要取決於你想要對結果做什麼。 – 2010-02-11 16:56:08