2009-11-22 40 views
16

如何在多行模式下使用正則表達式匹配和替換文本?C#中的多行正則表達式

我知道RegexOptions.Multiline選項,但在C#中用新的行字符指定全部匹配的最佳方式是什麼?

輸入:

<tag name="abc">this 
is 
a 
text</tag> 

輸出:

[tag name="abc"]this 
is 
a 
test 
[/tag] 

啊哈,我發現實際問題。 '&'和';'在正則表達式中是單行匹配文本,而同樣需要在正則表達式中轉義才能在有新行的情況下工作。

+0

咦?在正則表達式中,& and ;不是特殊字符。你能給個例子嗎? – 2009-11-22 21:57:03

+0

類似的東西,雖然沒有嘗試過下面的例子。 rx.Replace(「name [=] " abc "」,「abc」,「multiline text」); – 2009-11-23 07:46:10

回答

43

如果您的意思是已將作爲匹配表達式的換行符,那麼\n將爲您執行此操作。

否則,我想你可能誤解了Multiline/Singleline標誌。如果你想讓你的表情匹配幾行,你實際上想要使用RegexOptions.Singleline。這意味着它會將整個輸入字符串視爲單行,從而忽略換行符。這是你之後...?

Regex rx = new Regex("<tag name=\"(.*?)\">(.*?)</tag>", RegexOptions.Singleline); 
String output = rx.Replace("Text <tag name=\"abc\">test\nwith\nnewline</tag> more text...", "[tag name=\"$1\"]$2[/tag]"); 
+0

我想匹配一些可能包含新行字符的文本,但不一定。現在,如果你用RegexOptions.Singleline說,那麼你能告訴我一個關於如何做到這一點的例子。 – 2009-11-22 21:23:07

+0

看到我的編輯爲例。我似乎錯誤地認爲它是默認的壽命,當我測試它時...手動指定單行如示例,使示例工作,謝謝 – 2009-11-22 21:40:01

+0

,它看起來像問題是不同的,但感謝清除我的疑惑關於多線模式。 – 2009-11-22 21:48:28

12

這裏的一個正則表達式來匹配。它需要RegexOptions.Singleline選項,這使得.匹配換行符。

<(\w+) name="([^"]*)">(.*?)</\1> 

在這個正則表達式之後,第一個組包含標記,第二個標記名稱和第三個標記之間的內容。所以替換字符串看起來是這樣的:

[$1 name="$2"]$3[/$1] 

在C#中,這看起來像:

newString = Regex.Replace(oldString, 
    @"<(\w+) name=""([^""]*)"">(.*?)</\1>", 
    "[$1 name=\"$2\"]$3[/$1]", 
    RegexOptions.Singleline); 
+1

+1:非常好的代碼和解釋。 @Priyank Bolia:請記住,只有在 s不能嵌套的情況下才有效。如果他們*可以*,那麼正則表達式會使你失敗。 – 2009-11-22 21:40:51

+0

感謝這個出色的例子,我想通了,但這是一些其他問題。 – 2009-11-22 21:49:29