【问题标题】:Multiline regular expression in C# [duplicate]C#中的多行正则表达式[重复]
【发布时间】:2009-11-22 21:08:40
【问题描述】:

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

我知道RegexOptions.Multiline 选项,但是在 C# 中指定 match all 与换行符的最佳方法是什么?

输入:

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

输出:

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

啊,我发现了实际问题。 '&' 和 ';'在正则表达式中匹配单行中的文本,而在正则表达式中同样需要转义才能在有新行的情况下工作。

【问题讨论】:

  • 嗯? & 和 ;在正则表达式中没有特殊字符。能举个例子吗?
  • 类似的东西,虽然没有尝试过下面的例子。 rx.Replace("name[=]"abc"", "abc", "multiline text");

标签: c# regex


【解决方案1】:

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

【讨论】:

  • 我想匹配一些可能也包含换行符的文本,但不一定。现在,如果你说 RegexOptions.Singleline,那么你能告诉我一个如何做到这一点的例子吗?
  • 查看我的编辑以获取示例。我似乎误以为它是默认的,当我测试它时......像示例中那样手动指定单行,使示例工作,尽管
  • 谢谢,看起来问题有所不同,但感谢您消除了我对多行模式的疑虑。
  • 啊!使用 .MultiLine 枚举值后,我撞到了头!这种方式与多行不匹配:DOH:非常感谢您的解释!我想我应该首先阅读 VS 中的文档工具提示。 . .
【解决方案2】:

这是一个匹配的正则表达式。它需要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:非常好的代码和解释。 @Priyank Bolia:请记住,这仅在 不能嵌套时才有效。如果他们可以是,那么正则表达式会让你失败。
  • 感谢您提供的出色示例,但我发现这是其他问题。
猜你喜欢
  • 2013-04-15
  • 1970-01-01
  • 1970-01-01
  • 2017-09-07
  • 1970-01-01
  • 2012-07-03
  • 1970-01-01
  • 1970-01-01
  • 2013-04-28
相关资源
最近更新 更多