2009-07-02 1285 views
0

自從上次我必須使用正則表達式以來,我一直都很急於完成某些工作,所以希望我能快速回答這個快速問題。正則表達式在多個段落之間替換(.Net)

說我有以下文字:

Start 
A 
B 
C 
End  
Start 
A 
B 
C 
End Start 
A 
B 
C 
End 
Foo 
A 
B 
C 
Bar 

我想更換符合管,但只有「開始」和「結束」的話,使我最終的結果是間休息:

Start|A|B|C|End  
Start|A|B|C|End Start|A|B|C|End 
Foo 
A 
B 
C 
Bar 

非常感謝。

回答

5

當你開始解析這樣的表達式時,你不再處於正則表達式的領域。與XML類似,您需要根據上下文對不同的字符進行處理的表達式是比正則表達式更高級的語言。

更直接地穿過字符串的傳統方法在這種情況下會更好。

假設原始字符串由空格分割爲你的例子顯示,你可以直接劈在任何空白的字符串,並設置一個標誌,當你是一個StartEnd令牌之間把代幣,而不是換行之間的管道。

+0

這確實回答了原來的問題,但我想我應該對我的例子更具體。現實情況是,我只需要在兩個單詞之間應用臨時正則表達式。實際上,在「結束」和「開始」之間可能沒有2個換行符,「結束」和「開始」之間可能有任何內容,甚至只是一個空間,如「開始結束......」。 – Rene 2009-07-02 18:35:35

+0

mmmm ...。我不知道該怎麼做,我應該將這個答案標記爲正確的(因爲它是),並用我的問題的正確信息開啓一個新問題?或者我應該編輯原始帖子,並認爲這不是正確的答案(雖然它確實是一個正確的答案)。 – Rene 2009-07-02 18:38:54

1

正則表達式:

(Start)[\n]*(A)[\n]*(B)[\n]*(C)[\n]*(End) 

替換爲:

$1|$2|$3|$4|$5 

你可以把自己的價值觀,甚至的正則表達式開始,結束,A,B,並與部分C的可更換根據你的語言/正則表達式引擎有點不同,如果你告訴我你正在使用什麼,我可以更具體。

1

這適用於您提供的情況。不保證它可以用於更復雜的任何事情。

class Program 
{ 
    static void Main(string[] args) 
    { 
     string s = "Start" + Environment.NewLine + 
        "A" + Environment.NewLine + 
        "B" + Environment.NewLine + 
        "C" + Environment.NewLine + 
        "End" + Environment.NewLine + 
        "Start" + Environment.NewLine + 
        "A" + Environment.NewLine + 
        "B" + Environment.NewLine + 
        "C" + Environment.NewLine + 
        "End Start" + Environment.NewLine + 
        "A" + Environment.NewLine + 
        "B" + Environment.NewLine + 
        "C" + Environment.NewLine + 
        "End" + Environment.NewLine + 
        "Foo" + Environment.NewLine + 
        "A" + Environment.NewLine + 
        "B" + Environment.NewLine + 
        "C" + Environment.NewLine + 
        "Bar"; 

     Regex regex = new Regex(@"Start(\r\n[^\r\n(End)]*)*End", RegexOptions.Multiline); 
     string replaced = regex.Replace(s, AddPipes); 
     Console.WriteLine(replaced); 
     Console.ReadLine(); 
    } 

    static string AddPipes(Match m) 
    { 
     string x = m.ToString(); 
     return x.Replace("\r\n", "|"); 
    } 
} 
0

我同意Welbog,我想你可能會在這種情況下要求太多的正則表達式。我會推薦一個2通道的方法。據RegexBuddy,下面將匹配arbitary長度的目標段落

(Start)(\r\n)((.*)\2)+?(End) 

我就用上面的正則表達式來拉出匹配的段落在你的文字,然後用簡單的正則表達式或字符串替換功能交換鉻Lf字符到管道。