【发布时间】:2009-11-12 22:45:05
【问题描述】:
我将所有出现的\n 替换为<BR> 标记,但由于某种原因,输入的文本连续有许多\n,所以我需要将它们组合起来。
基本上,如果超过 1 个 \n 一起出现,只需将其替换为单个
标记。
有人可以帮我解决这个问题吗?
【问题讨论】:
-
不要低估自己。如果您甚至知道什么是正则表达式,那么您可能已经知道这个问题的答案了。
我将所有出现的\n 替换为<BR> 标记,但由于某种原因,输入的文本连续有许多\n,所以我需要将它们组合起来。
基本上,如果超过 1 个 \n 一起出现,只需将其替换为单个
标记。
有人可以帮我解决这个问题吗?
【问题讨论】:
这将用单个 <br /> 替换任何回车 (\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 />");
【讨论】:
< 字符?
?<! 而不是?!<。我刚刚进行了编辑以修复它。
使用以下代码:
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 />");
【讨论】:
注意 string.Replace() 比使用 RegEx 快得多:
string result = oldString.Replace("\n\n","\n");
result = result .Replace("\n","<br>");
【讨论】: