C# 如何用“替换每一秒的空格,而不是第一个/最后一个空格”&;nbsp&引用;在给定的字符串中?

C# 如何用“替换每一秒的空格,而不是第一个/最后一个空格”&;nbsp&引用;在给定的字符串中?,c#,asp.net,C#,Asp.net,假设我有以下字符串: string s = "A B C D TESTTEST BLA BLA TEST TEST2" 那么我需要以下几点: "A B  C   D    TESTTEST  BLA BLA      TEST       TEST2" 所以规则

假设我有以下字符串:

string s = "A B  C   D    TESTTEST  BLA BLA      TEST       TEST2"
那么我需要以下几点:

"A B  C   D    TESTTEST  BLA BLA      TEST       TEST2"
所以规则是:
a) 用

b) 如果最后一个空格被替换为
,请尝试将其向后移动一步(如果可能),以便强制空格不会触及下一个单词

背景:

我想用它把数据库中的数据打印到我的网站上。但我想优化强制空间以使用更少的空间。我还希望最后一个强制空格不要触及下一个单词(如果可能的话),这样一些搜索引擎更容易捕捉到这个单词

我需要循环遍历该字符串中的每个字符并计算发生次数,还是有更简单、更快和更奇特的方法

谢谢,两种解决方案都非常有效。
因此,我做了一个基准测试,以确定接受哪种解决方案:

@Guffa,您的解决方案需要22秒才能运行100万次
@Timwi,您的解决方案需要7秒才能运行100万次

我会给你们两个一票,但我会接受Timwi的解决方案。

你们可以这样做:

s = String.Concat(
  Regex.Split(s, "( +)")
  .Select((p, i) => i % 2 == 0 ? p :
    String.Concat(
      Enumerable.Repeat(" &nbsp;", p.Length<3 ? p.Length-1 : p.Length/2-1)
      .ToArray()) +
    (p.Length % 2 == 1 ? " " : "") +
    (p.Length > 2 ? "&nbsp; " : ""))
  .ToArray()
);
s=String.Concat(
Regex.Split(s,“(+)”)
.选择((p,i)=>i%2==0?p:
字符串。Concat(
可枚举。重复(“,p.长度2?”:”)
.ToArray()
);

这使用了一个
字符串。重复我写的扩展方法:

/// <summary>
/// Concatenates the specified number of repetitions of the current string.
/// </summary>
/// <param name="input">The string to be repeated.</param>
/// <param name="numTimes">The number of times to repeat the string.</param>
/// <returns>A concatenated string containing the original string the specified number of times.</returns>
public static string Repeat(this string input, int numTimes)
{
    if (numTimes == 0) return "";
    if (numTimes == 1) return input;
    if (numTimes == 2) return input + input;
    var sb = new StringBuilder();
    for (int i = 0; i < numTimes; i++)
        sb.Append(input);
    return sb.ToString();
}
//
///连接当前字符串的指定重复次数。
/// 
///要重复的字符串。
///重复字符串的次数。
///包含指定次数的原始字符串的串联字符串。
公共静态字符串重复(此字符串输入,int numTimes)
{
如果(numTimes==0)返回“”;
如果(numTimes==1)返回输入;
如果(numTimes==2)返回输入+输入;
var sb=新的StringBuilder();
对于(int i=0;i

顺便说一句,如果“节省空间”指的是带宽/存储空间,您可以使用
“\xa0”
而不是
,这在HTML中是等效的。

s=String.Concat(“,s,”)使其更加紧凑
@hobbs:这将阻止整个字符串进行换行。很好,
预换行(pre-wrap
:)该死的讨厌的下层选民,他们从不留下评论+1来纠正它。否决票也不是我投的。我现在就试试你的解决办法。
s.Replace("  ", " &nbsp;");
s.Replace("  ", " &nbsp;");