C#中的多行正则表达式

时间:2009-11-22 21:08:40

标签: c# regex

如何在多线模式下使用正则表达式匹配和替换文本?

我知道RegexOptions.Multiline选项,但是用C#中的新行字符指定匹配all的最佳方法是什么?

输入:

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

输出:

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

Aahh,我发现了实际问题。 '&安培;'和';'在Regex中,匹配文本在一行中,而同样需要在Regex中进行转义,以便在有新行的情况下工作。

2 个答案:

答案 0 :(得分:51)

如果您的意思是 是要匹配的表达式的换行符,那么\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]");

答案 1 :(得分: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);