如果我有:
Some text
More text
Even more text
什么是更优雅的获取方式:
Some text
More text
Even more text
都知道重复令牌的数量
使用正则表达式的方法是
string replaced = System.Text.RegularExpressions.Regex
.Replace(input, @"(?:\r\n)+", "\r\n");
((?:...)
语法是一个非捕获组,可以用一个捕获组(只是(...)
)替换,但效率稍低且可读性较差,IMO。)
Perhaps something like:
var result = string.Join("\r\n", s.Split(new[]{"\r\n"}, StringSplitOptions.RemoveEmptyEntries))
使用正则表达式。匹配整个字符串 '\r\n' 并替换为单个 '\r\n'
您需要的功能:
pattern = "(\\r\\n)+";
Regex rgx = new Regex(pattern);
newString = rgx.Replace(oldString, "\r\n");
编辑:很抱歉错过了 + 早先
我不知道 C# 语法,但只需使用简单的正则表达式将 (\r\n)+ 替换为 (\r\n)
您可以使用正则表达式:
str = Regex.Replace(str, "(\r\n)+", "\r\n")
另一种方法可能是在换行符上拆分删除空条目,然后再次加入:
str = String.Join("\r\n", str.Split(new string[]{"\r\n"}, StringSplitOptions.RemoveEmptyEntries);
考虑是否应该使用字符串文字"\r\n"
或Environment.NewLine
常量。这取决于数据的来源。
如果 \r\n 表示它通常的作用,那么您将用单个空行替换连续的空行。
我确信有用于此目的的工具。不过,我不知道 C#。
没有正则表达式(这让我很头疼)
string RemoveRepeated(string needle, string haystack)
{
string doubleNeedle = needle + needle;
while (haystack.IndexOf(doubleNeedle) >= 0)
haystack = haystack.Replace(doubleNeedle, needle);
return haystack;
}
更少的内存分配
string RemoveRepeated(string needle, string haystack)
{
if (needle == null)
throw new ArgumentNullException("needle");
if (haystack == null)
throw new ArgumentNullException("haystack");
if (needle == string.Empty || haystack == string.Empty)
return haystack;
string doubleNeedle = needle + needle;
var buffer = new StringBuilder(haystack);
int originalLength;
do
{
originalLength = buffer.Length;
buffer.Replace(doubleNeedle, needle);
} while (originalLength != buffer.Length);
return buffer.ToString();
}
初始检查在第一个版本中也同样有效
最快的方法:
Regex reg = new Regex(@"(\r\n)+");
string replacedString = reg.Replace("YOUR STRING TO BE REPLACED", Environment.NewLine);
就在几天前,这里有几乎相同的问题。问题不是 NewLine,而是空格。
还有一个人更喜欢 Split、Join 方法和另一个使用正则表达式的网站。所以 Jon 对两者进行了比较,结果发现编译正则表达式要快得多。
但我就是找不到这个问题了......