当前位置:  开发笔记 > 编程语言 > 正文

如何在C#中用一个空格替换多个空格?

如何解决《如何在C#中用一个空格替换多个空格?》经验,为你挑选了12个好方法。

如何在C#中只用一个空格替换字符串中的多个空格?

例:

1 2 3  4    5

将会:

1 2 3 4 5

Matt.. 589

我喜欢用:

myString = Regex.Replace(myString, @"\s+", " ");

因为它将捕获任何类型的空格(例如制表符,换行符等)的运行并用单个空格替换它们.



1> Matt..:

我喜欢用:

myString = Regex.Replace(myString, @"\s+", " ");

因为它将捕获任何类型的空格(例如制表符,换行符等)的运行并用单个空格替换它们.


轻微修改:Regex.Replace(source,@"(\ s)\ s +","$ 1"); 这将返回找到的第一个空格类型.因此,如果您有5个选项卡,它将返回一个选项卡.有人喜欢这个.
本着@FctenKate解决方案的精神:Regex.Replace(来源,@"(\ s)\ 1 +","$ 1"); 将用一个替换多个*相同*连续的字符.

2> Patrick Desj..:
RegexOptions options = RegexOptions.None;
Regex regex = new Regex("[ ]{2,}", options);     
tempo = regex.Replace(tempo, " ");


@Oscar Joel的代码不是所有角色的简单循环!它是一个隐藏的嵌套循环,具有二次最坏情况.相比之下,这个正则表达式是线性的,只构建一个字符串(=与Joel的代码相比大大降低了分配成本),而且引擎可以优化它的地狱(说实话,我怀疑.NET正则表达式是足够聪明,但理论上这个正则表达式可以如此便宜地实现,甚至不再有趣;它只需要一个具有三个状态的DFA,每个状态一个转换,没有其他信息).
@Joel:不能同意.我确实这种方式对于足够大的字符串来说比你的更有效,并且可以在一行中完成.什么是矫枉过正?
IMO,@ Claig评论就足够了.//这个块用一个替换多个空格...... :)
真的,RegEx对此非常苛刻.
我有复制粘贴它,它的工作原理.我真的不喜欢REgex,但这次它拯救了我的生命.

3> tvanfosson..:
string xyz = "1   2   3   4   5";
xyz = string.Join( " ", xyz.Split( new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries ));


我喜欢它,因为它不需要正则表达式
这比正则表达式更具可读性,我更喜欢它,因为我不需要学习其他语法
对于大字符串,这将是低效的.
这也删除了前导和尾随空格.

4> 小智..:

我认为马特的答案是最好的,但我不相信这是对的.如果要替换换行符,则必须使用:

myString = Regex.Replace(myString, @"\s+", " ", RegexOptions.Multiline);


RegexOptions.Multiline更改^和$的含义,使它们匹配每一行的开头和结尾($ = \n),而不是整个多行字符串.因为\ s相当于[\ f \n\r\t\t\v],即使Multiline选项关闭,也应该替换换行符.

5> cuongle..:

另一种使用LINQ的方法:

 var list = str.Split(' ').Where(s => !string.IsNullOrWhiteSpace(s));
 str = string.Join(" ", list);



6> Joel Coehoor..:

它比所有这些简单得多:

while(str.Contains("  ")) str = str.Replace("  ", " ");


如果字符串包含3个或更多空格的序列,则效率远低于正则表达式"{2,}".
RegexOptions.Compiled增加了很多开销,将正则表达式编译成IL.不要使用它,除非你的应用程序经常使用正则表达式或足够大的字符串使增加的匹配速度抵消降低的编译速度.
@JanGoyvaerts:即使有10个空格,当我进行快速而肮脏的测试时,正则表达式也会变慢.话虽如此,它只需要一个充满空格的巨型子串来完全消除while循环的性能.为了公平起见,我使用的是RegexOptions.Compiled,而不是速度较慢的Regex.Replace.

7> ScubaSteve..:

即使只是简单的任务,正则表达式也会相当慢.这将创建一个可以在任何情况下使用的扩展方法string.

    public static class StringExtension
    {
        public static String ReduceWhitespace(this String value)
        {
            var newString = new StringBuilder();
            bool previousIsWhitespace = false;
            for (int i = 0; i < value.Length; i++)
            {
                if (Char.IsWhiteSpace(value[i]))
                {
                    if (previousIsWhitespace)
                    {
                        continue;
                    }

                    previousIsWhitespace = true;
                }
                else
                {
                    previousIsWhitespace = false;
                }

                newString.Append(value[i]);
            }

            return newString.ToString();
        }
    }

它将被用作这样的:

string testValue = "This contains     too          much  whitespace."
testValue = testValue.ReduceWhitespace();
// testValue = "This contains too much whitespace."



8> Jan Goyvaert..:
myString = Regex.Replace(myString, " {2,}", " ");



9> Nolonar..:

对于那些不喜欢的人Regex,这里有一个方法使用StringBuilder:

    public static string FilterWhiteSpaces(string input)
    {
        if (input == null)
            return string.Empty;

        StringBuilder stringBuilder = new StringBuilder(input.Length);
        for (int i = 0; i < input.Length; i++)
        {
            char c = input[i];
            if (i == 0 || c != ' ' || (c == ' ' && input[i - 1] != ' '))
                stringBuilder.Append(c);
        }
        return stringBuilder.ToString();
    }

在我的测试中,与静态编译的Regex相比,这种方法平均快16倍,中小型字符串非常大.与非编译或非静态正则表达式相比,这应该更快.

请记住,它并没有删除开头或结尾的空格,只有这样多次出现.



10> ravish.hacke..:

您只需在一个解决方案中执行此操作即可!

string s = "welcome to  london";
s.Replace(" ", "()").Replace(")(", "").Replace("()", " ");

如果您愿意,可以选择其他括号(甚至其他字符).



11> somebody..:

这是一个较短的版本,只有在你只执行一次时才会使用它,因为它Regex每次调用时都会创建一个新的类实例.

temp = new Regex(" {2,}").Replace(temp, " "); 

如果你不熟悉正则表达式,这里有一个简短的解释:

{2,}使得用于它前面的字符正则表达式搜索,发现2和无限次之间的子串.
.Replace(temp, " ")内容替换字符串临时用空间中的所有比赛.

如果你想多次使用它,这是一个更好的选择,因为它在编译时创建了正则表达式IL:

Regex singleSpacify = new Regex(" {2,}", RegexOptions.Compiled);
temp = singleSpacify.Replace(temp, " ");



12> 小智..:

没有正则表达式,没有Linq ...删除前导和尾随空格以及将任何嵌入的多个空间段减少到一个空格

string myString = "   0 1 2  3   4               5  ";
myString = string.Join(" ", myString.Split(new char[] { ' ' }, 
StringSplitOptions.RemoveEmptyEntries));

结果:"0 1 2 3 4 5"

推荐阅读
夏晶阳--艺术
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有