2009-11-22 97 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