【问题标题】:How can I replace multiple line breaks with a single <BR>?如何用单个 <BR> 替换多个换行符?
【发布时间】:2009-11-12 22:45:05
【问题描述】:

我将所有出现的\n 替换为&lt;BR&gt; 标记,但由于某种原因,输入的文本连续有许多\n,所以我需要将它们组合起来。

基本上,如果超过 1 个 \n 一起出现,只需将其替换为单个
标记。

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 不要低估自己。如果您甚至知道什么是正则表达式,那么您可能已经知道这个问题的答案了。

标签: c# regex editor


【解决方案1】:

这将用单个 &lt;br /&gt; 替换任何回车 (\r) 和/或换行 (\n) 序列:

string formatted = Regex.Replace(original, @"[\r\n]+", "<br />");

如果您只想替换两个或多个项目的序列,那么简单的答案是使用{2,} 量词(意思是“至少两次重复”)而不是+(意思是“至少一次重复"):

string formatted = Regex.Replace(original, @"[\r\n]{2,}", "<br />");

请注意,上面的表达式会将常见的 CR+LF 组合视为两个项目的序列。您可能希望将 CR+LF 视为单个项目,在这种情况下,表达式会变得稍微复杂一些:

string formatted = Regex.Replace(original, @"(?:\r\n|\r(?!\n)|(?<!\r)\n){2,}", "<br />");

【讨论】:

  • \r 用于回车。在 Windows (DOS) 格式的文本中,您会看到 \r\n 形式的回车/换行组合。
  • 是否可以在替换之前设置至少 2 次重复?
  • 是的,这就是我的回答是试图做的。 \n\n+ 会做到的。但是如果你想包含回车,那么这将起作用: (\r\n)(\r\n)+
  • @Luke 为什么第三段有&lt; 字符?
  • @smallatom:你发现了一个在这里已经存在五年多的错字了!它是negative look-behind 断言的一部分,但它应该读作?&lt;! 而不是?!&lt;。我刚刚进行了编辑以修复它。
【解决方案2】:

使用以下代码:

str = Regex.Replace(str, @"[\r\n]+", "<br />");

多次调用普通的Replace 方法而不使用正则表达式可能会更快,如下所示:

int oldLength;
do {
    oldLength = str.Length;
    str = str.Replace('\r', '\n');
    str = str.Replace("\n\n", "\n");
} while(str.Length != oldLength);

str = str.Replace("\n", "<br />");

【讨论】:

    【解决方案3】:

    注意 string.Replace() 比使用 RegEx 快得多:

    string result = oldString.Replace("\n\n","\n");
    result = result .Replace("\n","<br>");
    

    【讨论】:

    • 这不会处理三个换行符;你需要循环调用它。看我的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-08
    • 2012-01-14
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    • 2022-08-07
    • 2015-08-15
    相关资源
    最近更新 更多