我需要在文档中将多个空格替换为单个空格(每次迭代)。无论它们是空格,制表符还是换行符,任何类型的空格的任何组合都需要被截断为单个空格。
假设我们有字符串:“Hello,\ t \ t \ n \ t \ n world”,(其中\ t和\ n分别表示制表符和换行符)然后我需要它成为“Hello,世界”。
我更加普遍地对正则表达式感到困惑,我最后只是问。
考虑:
我无法控制该文件,因为它可能是互联网上的任何文件。
我正在使用C#,所以如果有人知道如何在C#中专门做这件事,那就更棒了。
我真的不必使用正则表达式(在有人问之前),但我认为它可能是最佳方式,因为正则表达式是为这种东西设计的,而我自己的strpos / str_replace / substr汤会可能表现不佳。性能在这一点上很重要,所以我基本上寻找的是对互联网上的任何随机文本文件执行此操作的有效方法(记住,我无法预测大小!)。
提前致谢! - Helgi
答案 0 :(得分:11)
newString = Regex.Replace(oldString, @"\s+", " ");
对于任何空白字符,“\ s”是regex character class,而+表示“一个或多个”。它用一个简单的空格字符替换每个出现。
答案 1 :(得分:4)
您可能会发现此答案很有用:
How do I replace multiple spaces with a single space in C#?
调整答案以同时替换制表符和换行符也相对简单:
RegexOptions options = RegexOptions.None;
Regex regex = new Regex(@"\s+", options);
tempo = regex.Replace(tempo, @" ");
答案 2 :(得分:1)
作为同情Jamie Zawinski在正则表达式上的立场的人,我会提供一个替代它的价值。
不想对此有所了解,但我会说它比正则表达更快,不过你是否会处理字符串足够长的时间来看待差异是另一回事。
public static string CompressWhiteSpace(string value)
{
if (value == null) return null;
bool inWhiteSpace = false;
StringBuilder builder = new StringBuilder(value.Length);
foreach (char c in value)
{
if (Char.IsWhiteSpace(c))
{
inWhiteSpace = true;
}
else
{
if (inWhiteSpace) builder.Append(' ');
inWhiteSpace = false;
builder.Append(c);
}
}
return builder.ToString();
}
答案 3 :(得分:0)
I would suggest you replace your chomp with
$line =~ s/\s+$//;
which will strip off all trailing white spaces - tabs, spaces, new lines and returns as well.
取自:http://www.wellho.net/forum/Perl-Programming/New-line-characters-beware.html
我知道它的Perl,但它应该对你有用。
答案 4 :(得分:0)
实际上我认为扩展方法可能会更高效,因为你没有正则表达式的状态机开销。从本质上讲,它成为一个非常专业的模式匹配器。
public static string Collapse( this string source )
{
if (string.IsNullOrEmpty( source ))
{
return source;
}
StringBuilder builder = new StringBuilder();
bool inWhiteSpace = false;
bool sawFirst = false;
foreach (var c in source)
{
if (char.IsWhiteSpace(c))
{
inWhiteSpace = true;
}
else
{
// only output a whitespace if followed by non-whitespace
// except at the beginning of the string
if (inWhiteSpace && sawFirst)
{
builder.Append(" ");
}
inWhiteSpace = false;
sawFirst = true;
builder.Append(c);
}
}
return builder.ToString();
}