从字符串中删除所有空格的有效方法?


358

我正在调用REST API,并且正在收到XML响应。它返回一个工作区名称列表,我正在编写一个快速IsExistingWorkspace()方法。由于所有工作空间均由不带空格的连续字符组成,因此,我假设找出列表中是否存在特定工作空间的最简单方法是删除所有空格(包括换行符),然后执行此操作(XML是从网络接收的字符串)请求):

XML.Contains("<name>" + workspaceName + "</name>");

我知道它是区分大小写的,并且我依靠它。我只需要一种有效删除字符串中所有空格的方法。我知道RegEx和LINQ可以做到,但是我对其他想法持开放态度。我主要只关心速度。


6
使用regex解析XML与使用regex 解析HTML几乎一样糟糕。
dtb 2011年

3
@henk holterman; 请参阅下面的答案,regexp似乎并非在所有情况下都是最快的。
Henk J Meulekamp 2013年

正则表达式似乎根本不是最快的。我总结了从字符串中删除空格的许多不同方法的结果。摘要是在下面的答案- stackoverflow.com/a/37347881/582061
了Stian Standahl

Answers:


616

即使您说过您不想使用正则表达式,这也是我所知道的最快方法:

Regex.Replace(XML, @"\s+", "")

1
我可以使用正则表达式,只是不确定这是否是最快的方法。
Corey Ogburn

1
我很确定是这样。至少在幕后,您必须检查每个字符,这只是进行线性搜索。
slandau 2011年

19
那不是Regex.Replace(XML, @"\s+", "")吗?
Jan-Peter Vos

61
如果您打算多次执行此操作,请创建并存储一个Regex实例。这样可以节省每次构造它的开销,这比您想象的要昂贵。private static readonly Regex sWhitespace = new Regex(@"\s+"); public static string ReplaceWhitespace(string input, string replacement) { return sWhitespace.Replace(input, replacement); }
hypehuman

10
对于RegEx的新用户,并寻求对该表达式的含义的解释,\s意味着“匹配任何空白标记”,并+意味着“匹配一个或多个进行中的标记”。此外 RegExr是一个不错的网站练习书写正则表达式与表达,如果你想尝试。
jrh

181

我有一个没有regexp的替代方法,它似乎表现不错。这是布兰登·莫雷兹(Brandon Moretz)答案的延续:

 public static string RemoveWhitespace(this string input)
 {
    return new string(input.ToCharArray()
        .Where(c => !Char.IsWhiteSpace(c))
        .ToArray());
 }

我在一个简单的单元测试中对其进行了测试:

[Test]
[TestCase("123 123 1adc \n 222", "1231231adc222")]
public void RemoveWhiteSpace1(string input, string expected)
{
    string s = null;
    for (int i = 0; i < 1000000; i++)
    {
        s = input.RemoveWhitespace();
    }
    Assert.AreEqual(expected, s);
}

[Test]
[TestCase("123 123 1adc \n 222", "1231231adc222")]
public void RemoveWhiteSpace2(string input, string expected)
{
    string s = null;
    for (int i = 0; i < 1000000; i++)
    {
        s = Regex.Replace(input, @"\s+", "");
    }
    Assert.AreEqual(expected, s);
}

对于1,000,000次尝试,第一个选项(没有regexp)运行的时间少于一秒钟(在我的计算机上为700毫秒),第二个过程需要3.5秒。


40
.ToCharArray()没有必要; 您可以.Where()直接在字符串上使用。
ProgramFOX 2014年

10
这里只需要注意。正则表达式慢...在小字符串上!如果您说您拥有《美国税法》卷的数字化版本(约数百万个单词?),并进行了几次迭代,那么Regex就是国王!它不是什么更快,而是在哪种情况下应该使用什么。您在这里只证明了一半方程式。-1,直到您证明测试的后半部分,以便答案可以更深入地了解何时应使用什么。
Piotr Kula 2015年

17
@ppumkin他要求一次性删除空白。没有其他处理的多次迭代。我不会将单通行符空格删除放入有关基准文本处理的扩展文章中。
Henk J Meulekamp 2015年

1
您说过这次不希望它用于正则表达式,但没有说为什么。
Piotr Kula 2015年

2
@ProgramFOX,在另一个问题(无法轻易找到它)中,我注意到至少在某些查询中,使用ToCharArray.Where()直接在字符串上使用要快。这与IEnumerable<>每个迭代步骤中的开销有关,并且ToCharArray效率非常高(块复制),并且编译器会优化数组的迭代。为什么存在这种差异,没有人能够解释我,但是在删除之前先进行测量ToCharArray()
亚伯

87

尝试使用C#中的字符串替换方法。

XML.Replace(" ", string.Empty);

28
不删除标签或换行符。如果我现在进行多次删除,那么我将对该字符串进行多次传递。
Corey Ogburn

11
不赞成删除所有空格,就像slandau和Henk的答案一样。
马特·萨赫

@MattSach为什么不删除所有空格?
Zapnologica

4
@Zapnologica它只是替换空格字符。OP还要求替换换行符(即使它们不是空格字符,它们也是“空白”字符)。
马特·萨赫

75

我的解决方案是使用Split and Join,它出奇的快,实际上是这里最快的最佳答案。

str = string.Join("", str.Split(default(string[]), StringSplitOptions.RemoveEmptyEntries));

使用空格公司新行和制表符的简单字符串上10,000个循环的时间

  • 分割/合并= 60毫秒
  • linq chararray = 94毫秒
  • 正则表达式= 437毫秒

通过将其包装在方法中以赋予其含义来改进此方法,并在我们使用它时将其作为扩展方法...

public static string RemoveWhitespace(this string str) {
    return string.Join("", str.Split(default(string[]), StringSplitOptions.RemoveEmptyEntries));
}

3
我真的很喜欢这种解决方案,自LINQ之前的日子以来,我一直在使用类似的解决方案。实际上,我对LINQ的性能印象深刻,对regex感到有些惊讶。也许代码不是正则表达式的最佳选择(例如,您必须缓存正则表达式对象)。但是问题的症结在于数据的“质量”至关重要。也许长字符串的正则表达式将胜过其他选择。这将是一个有趣的基准测试... :-)
Loudenvier

1
default(string [])==如何列出所有空白字符?我看到它正常工作,但我不明白该怎么做?
杰克·德鲁

5
@kernowcode你指的是在2个与重载之间的模糊性string[]char[]?您只需指定所需的对象即可,例如:string.Join("", str.Split((string[])null, StringSplitOptions.RemoveEmptyEntries));default在这种情况下,这实际上是您的调用,因为它null也会返回:它有助于编译器确定选择哪个重载。因此,我的评论是错误的,因为您的评论“ Split需要有效的数组,而null不会...”的语句为假。没什么大不了的,自从杰克·德鲁(Jake Drew)问起这是怎么回事以来,值得一提。+1为您的答案
Frank J

6
很棒的主意...但我会这样做,如下:string.Concat("H \ne llo Wor ld".Split())
michaelkrisper

3
michaelkrisper解决方案非常易读。我进行了测试,对于相同字符串的10,000次迭代,“拆分/合并”(162毫秒)的性能优于“拆分/合并”(180毫秒)。
kernowcode's

45

Henks答案的基础上,我用他的答案创建了一些测试方法,并添加了一些更优化的方法。我发现结果根据输入字符串的大小而有所不同。因此,我测试了两个结果集。在最快的方法中,链接源具有更快的方法。但是,由于它被认为是不安全的,因此我忽略了这一点。

长输入字符串结果:

  1. InPlaceCharArray:2021毫秒(Sunsetquest的答案)-(原始来源
  2. 字符串拆分然后加入:4277ms(Kernowcode的答案
  3. 字符串读取器:6082 ms
  4. LINQ使用本机char.IsWhitespace:7357毫秒
  5. LINQ:7746毫秒(Henk的回答
  6. 前循环:32320毫秒
  7. Regex已编译:37157 ms
  8. 正则表达式:42940毫秒

简短的输入字符串结果:

  1. InPlaceCharArray:108毫秒(Sunsetquest的答案)-(原始来源
  2. 字符串拆分然后加入:294毫秒(Kernowcode的答案
  3. 字符串阅读器:327毫秒
  4. 前循环:343毫秒
  5. LINQ使用本机char.IsWhitespace:624毫秒
  6. LINQ:645ms(Henk的回答
  7. Regex已编译:1671 ms
  8. 正则表达式:2599毫秒

代码

public class RemoveWhitespace
{
    public static string RemoveStringReader(string input)
    {
        var s = new StringBuilder(input.Length); // (input.Length);
        using (var reader = new StringReader(input))
        {
            int i = 0;
            char c;
            for (; i < input.Length; i++)
            {
                c = (char)reader.Read();
                if (!char.IsWhiteSpace(c))
                {
                    s.Append(c);
                }
            }
        }

        return s.ToString();
    }

    public static string RemoveLinqNativeCharIsWhitespace(string input)
    {
        return new string(input.ToCharArray()
            .Where(c => !char.IsWhiteSpace(c))
            .ToArray());
    }

    public static string RemoveLinq(string input)
    {
        return new string(input.ToCharArray()
            .Where(c => !Char.IsWhiteSpace(c))
            .ToArray());
    }

    public static string RemoveRegex(string input)
    {
        return Regex.Replace(input, @"\s+", "");
    }

    private static Regex compiled = new Regex(@"\s+", RegexOptions.Compiled);
    public static string RemoveRegexCompiled(string input)
    {
        return compiled.Replace(input, "");
    }

    public static string RemoveForLoop(string input)
    {
        for (int i = input.Length - 1; i >= 0; i--)
        {
            if (char.IsWhiteSpace(input[i]))
            {
                input = input.Remove(i, 1);
            }
        }
        return input;
    }

    public static string StringSplitThenJoin(this string str)
    {
        return string.Join("", str.Split(default(string[]), StringSplitOptions.RemoveEmptyEntries));
    }

    public static string RemoveInPlaceCharArray(string input)
    {
        var len = input.Length;
        var src = input.ToCharArray();
        int dstIdx = 0;
        for (int i = 0; i < len; i++)
        {
            var ch = src[i];
            switch (ch)
            {
                case '\u0020':
                case '\u00A0':
                case '\u1680':
                case '\u2000':
                case '\u2001':
                case '\u2002':
                case '\u2003':
                case '\u2004':
                case '\u2005':
                case '\u2006':
                case '\u2007':
                case '\u2008':
                case '\u2009':
                case '\u200A':
                case '\u202F':
                case '\u205F':
                case '\u3000':
                case '\u2028':
                case '\u2029':
                case '\u0009':
                case '\u000A':
                case '\u000B':
                case '\u000C':
                case '\u000D':
                case '\u0085':
                    continue;
                default:
                    src[dstIdx++] = ch;
                    break;
            }
        }
        return new string(src, 0, dstIdx);
    }
}

测试

[TestFixture]
public class Test
{
    // Short input
    //private const string input = "123 123 \t 1adc \n 222";
    //private const string expected = "1231231adc222";

    // Long input
    private const string input = "123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222";
    private const string expected = "1231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc222";

    private const int iterations = 1000000;

    [Test]
    public void RemoveInPlaceCharArray()
    {
        string s = null;
        var stopwatch = Stopwatch.StartNew();
        for (int i = 0; i < iterations; i++)
        {
            s = RemoveWhitespace.RemoveInPlaceCharArray(input);
        }

        stopwatch.Stop();
        Console.WriteLine("InPlaceCharArray: " + stopwatch.ElapsedMilliseconds + " ms");
        Assert.AreEqual(expected, s);
    }

    [Test]
    public void RemoveStringReader()
    {
        string s = null;
        var stopwatch = Stopwatch.StartNew();
        for (int i = 0; i < iterations; i++)
        {
            s = RemoveWhitespace.RemoveStringReader(input);
        }

        stopwatch.Stop();
        Console.WriteLine("String reader: " + stopwatch.ElapsedMilliseconds + " ms");
        Assert.AreEqual(expected, s);
    }

    [Test]
    public void RemoveLinqNativeCharIsWhitespace()
    {
        string s = null;
        var stopwatch = Stopwatch.StartNew();
        for (int i = 0; i < iterations; i++)
        {
            s = RemoveWhitespace.RemoveLinqNativeCharIsWhitespace(input);
        }

        stopwatch.Stop();
        Console.WriteLine("LINQ using native char.IsWhitespace: " + stopwatch.ElapsedMilliseconds + " ms");
        Assert.AreEqual(expected, s);
    }

    [Test]
    public void RemoveLinq()
    {
        string s = null;
        var stopwatch = Stopwatch.StartNew();
        for (int i = 0; i < iterations; i++)
        {
            s = RemoveWhitespace.RemoveLinq(input);
        }

        stopwatch.Stop();
        Console.WriteLine("LINQ: " + stopwatch.ElapsedMilliseconds + " ms");
        Assert.AreEqual(expected, s);
    }

    [Test]
    public void RemoveRegex()
    {
        string s = null;
        var stopwatch = Stopwatch.StartNew();
        for (int i = 0; i < iterations; i++)
        {
            s = RemoveWhitespace.RemoveRegex(input);
        }

        stopwatch.Stop();
        Console.WriteLine("Regex: " + stopwatch.ElapsedMilliseconds + " ms");

        Assert.AreEqual(expected, s);
    }

    [Test]
    public void RemoveRegexCompiled()
    {
        string s = null;
        var stopwatch = Stopwatch.StartNew();
        for (int i = 0; i < iterations; i++)
        {
            s = RemoveWhitespace.RemoveRegexCompiled(input);
        }

        stopwatch.Stop();
        Console.WriteLine("RegexCompiled: " + stopwatch.ElapsedMilliseconds + " ms");

        Assert.AreEqual(expected, s);
    }

    [Test]
    public void RemoveForLoop()
    {
        string s = null;
        var stopwatch = Stopwatch.StartNew();
        for (int i = 0; i < iterations; i++)
        {
            s = RemoveWhitespace.RemoveForLoop(input);
        }

        stopwatch.Stop();
        Console.WriteLine("ForLoop: " + stopwatch.ElapsedMilliseconds + " ms");

        Assert.AreEqual(expected, s);
    }

    [TestMethod]
    public void StringSplitThenJoin()
    {
        string s = null;
        var stopwatch = Stopwatch.StartNew();
        for (int i = 0; i < iterations; i++)
        {
            s = RemoveWhitespace.StringSplitThenJoin(input);
        }

        stopwatch.Stop();
        Console.WriteLine("StringSplitThenJoin: " + stopwatch.ElapsedMilliseconds + " ms");

        Assert.AreEqual(expected, s);
    }
}

编辑:从Kernowcode测试了一个不错的班轮。


24

只是一个替代方法,因为它看起来很不错:)-注意:Henks的回答是最快的。

input.ToCharArray()
 .Where(c => !Char.IsWhiteSpace(c))
 .Select(c => c.ToString())
 .Aggregate((a, b) => a + b);

测试1,000,000个循环 "This is a simple Test"

此方法= 1.74秒正则
表达式= 2.58秒
new String(Henks)= 0.82


1
为什么这被否决?它是完全可以接受的,符合要求的,比RegEx选项更快的工作并且可读性强吗?
BlueChippy 2015年

4
因为它可以写得更短:new string(input.Where(c =>!Char.IsWhiteSpace(c))。ToArray());
Bas Smit

7
可能是正确的-但答案仍然成立,可读性强,比正则表达式快,并且产生了预期的结果。在此之后,还有许多其他答案……因此,否决票没有意义。
BlueChippy 2015年

2
是否有“ 0.82”的单位?还是相对衡量(82%)?您可以编辑答案以使其更清晰吗?
Peter Mortensen

20

我在Felipe Machado的CodeProject 找到了一篇不错的文章(在Richard Robertson的帮助下)

他测试了十种不同的方法。这是最快的不安全版本...

public static unsafe string TrimAllWithStringInplace(string str) {
    fixed (char* pfixed = str) {
        char* dst = pfixed;
        for (char* p = pfixed; *p != 0; p++)

            switch (*p) {

                case '\u0020': case '\u00A0': case '\u1680': case '\u2000': case '\u2001':

                case '\u2002': case '\u2003': case '\u2004': case '\u2005': case '\u2006':

                case '\u2007': case '\u2008': case '\u2009': case '\u200A': case '\u202F':

                case '\u205F': case '\u3000': case '\u2028': case '\u2029': case '\u0009':

                case '\u000A': case '\u000B': case '\u000C': case '\u000D': case '\u0085':
                    continue;

                default:
                    *dst++ = *p;
                    break;
            }

        return new string(pfixed, 0, (int)(dst - pfixed));
    }
}

最快的安全版本...

public static string TrimAllWithInplaceCharArray(string str) {

    var len = str.Length;
    var src = str.ToCharArray();
    int dstIdx = 0;

    for (int i = 0; i < len; i++) {
        var ch = src[i];

        switch (ch) {

            case '\u0020': case '\u00A0': case '\u1680': case '\u2000': case '\u2001':

            case '\u2002': case '\u2003': case '\u2004': case '\u2005': case '\u2006':

            case '\u2007': case '\u2008': case '\u2009': case '\u200A': case '\u202F':

            case '\u205F': case '\u3000': case '\u2028': case '\u2029': case '\u0009':

            case '\u000A': case '\u000B': case '\u000C': case '\u000D': case '\u0085':
                continue;

            default:
                src[dstIdx++] = ch;
                break;
        }
    }
    return new string(src, 0, dstIdx);
}

Stian Standahl在Stack Overflow上还有一些不错的独立基准测试,也显示了Felipe的功能比下一个最快的功能快300%。


我尝试将其翻译成C ++,但有点卡住了。为什么我的端口可能出故障的任何想法?stackoverflow.com/questions/42135922/…–
乔恩·凯奇

2
我无法抗拒。查看您所引用的文章的评论部分。您会发现我是“ Basketcase Software”。他和他一起工作了一段时间。当这个问题再次出现时,我完全忘记了这一点。感谢您的美好回忆。:)
理查德·罗伯逊

1
如果只想删除多余的WS,该怎么办?那stackoverflow.com/questions/17770202/…mod呢?
汤姆

最快的速度稍慢;-)字符串在这里比容器更好(在应用程序4:15到3:55 =>减少8.5%,但是当字符串3:30 => 21.4%减少并且profiller显示花费约50%此方法)。因此,与此处使用的(慢速)数组转换相比,实际的实时字符串应快40%左右。
汤姆

15

如果需要出色的性能,在这种情况下,应避免使用LINQ和正则表达式。我做了一些性能基准测试,似乎如果您想从字符串的开头和结尾去除空格,则string.Trim()是您的最终功能。

如果您需要从字符串中去除所有空格,则以下方法可以最快地完成此处发布的所有操作:

    public static string RemoveWhitespace(this string input)
    {
        int j = 0, inputlen = input.Length;
        char[] newarr = new char[inputlen];

        for (int i = 0; i < inputlen; ++i)
        {
            char tmp = input[i];

            if (!char.IsWhiteSpace(tmp))
            {
                newarr[j] = tmp;
                ++j;
            }
        }
        return new String(newarr, 0, j);
    }

我很想知道您基准测试的详细信息-并不是我对此表示怀疑,但是我对Linq涉及的管理费用感到好奇。有多糟?
Mark Meuer 2014年

我还没有重新运行所有测试,但是我能记住很多:与Linq有关的一切都比没有它的一切慢很多。如果使用Linq,则对string / char函数和构造函数的所有巧妙用法都不会产生任何百分比差异。
JHM 2015年

11

正则表达式过大。只需对字符串使用扩展名(感谢Henk)。这很简单,应该已经成为框架的一部分。无论如何,这是我的实现:

public static partial class Extension
{
    public static string RemoveWhiteSpace(this string self)
    {
        return new string(self.Where(c => !Char.IsWhiteSpace(c)).ToArray());
    }
}

这基本上是一个不必要的答案(正则表达式是多余的,但是比给出的解决方案更快—并且已经被接受吗?)
W1ll1amvl 2014年

如何在字符串上使用Linq扩展方法?无法找出我正在使用哪个System.Linq
用途的

好的,看起来这在PCL中不可用,IEnumerable <char>在Microsoft String实现中是有条件的。。。我正在使用不支持此功能的Profile259 :)
GGirard,2016年

4

这是RegEx解决方案的简单线性替代方案。我不确定哪个更快;您必须对其进行基准测试。

static string RemoveWhitespace(string input)
{
    StringBuilder output = new StringBuilder(input.Length);

    for (int index = 0; index < input.Length; index++)
    {
        if (!Char.IsWhiteSpace(input, index))
        {
            output.Append(input[index]);
        }
    }
    return output.ToString();
}

3

我需要用空格代替字符串中的空白,但不能重复空格。例如,我需要转换以下内容:

"a b   c\r\n d\t\t\t e"

"a b c d e"

我用下面的方法

private static string RemoveWhiteSpace(string value)
{
    if (value == null) { return null; }
    var sb = new StringBuilder();

    var lastCharWs = false;
    foreach (var c in value)
    {
        if (char.IsWhiteSpace(c))
        {
            if (lastCharWs) { continue; }
            sb.Append(' ');
            lastCharWs = true;
        }
        else
        {
            sb.Append(c);
            lastCharWs = false;
        }
    }
    return sb.ToString();
}

2

我假设您的XML响应如下所示:

var xml = @"<names>
                <name>
                    foo
                </name>
                <name>
                    bar
                </name>
            </names>";

处理XML的最好方法是使用XML解析器,例如LINQ to XML

var doc = XDocument.Parse(xml);

var containsFoo = doc.Root
                     .Elements("name")
                     .Any(e => ((string)e).Trim() == "foo");

一旦确认特定的<name>标记具有正确的值,就可以完成。解析文档会不会有一些开销?
Corey Ogburn

4
当然,这有一些开销。但这具有正确性的好处。基于正则表达式的解决方案很难正确解决。如果您确定LINQ to XML解决方案太慢,则始终可以用更快的速度替换它。但是,在知道正确的实现速度太慢之前,应避免寻找最有效的实现。
dtb 2011年

这将在我的雇主的后端服务器中运行。轻巧是我想要的。我不想要“正常”但最佳的东西。
Corey Ogburn

4
LINQ到XML是.NET中最轻巧的方式与XML正确工作一个
DTB

1

这是另一个变体:

public static string RemoveAllWhitespace(string aString)
{
  return String.Join(String.Empty, aString.Where(aChar => aChar !Char.IsWhiteSpace(aChar)));
}

与大多数其他解决方案一样,我没有执行详尽的基准测试,但这足以满足我的目的。


1

我们可以用:

    public static string RemoveWhitespace(this string input)
    {
        if (input == null)
            return null;
        return new string(input.ToCharArray()
            .Where(c => !Char.IsWhiteSpace(c))
            .ToArray());
    }

这几乎与Henk的答案完全相同。唯一的区别是您检查null
Corey Ogburn

是的,检查null是否重要
Tarik BENARAB

1
也许这应该只是对他的回答的评论。我很高兴您提出来了。我不知道扩展方法可以在空对象上调用。
科里·奥格本

0

我发现不同的结果是正确的。我试图用一个空格替换所有空格,而正则表达式非常慢。

return( Regex::Replace( text, L"\s+", L" " ) );

对我来说(在C ++ cli中)最有效的是:

String^ ReduceWhitespace( String^ text )
{
  String^ newText;
  bool    inWhitespace = false;
  Int32   posStart = 0;
  Int32   pos      = 0;
  for( pos = 0; pos < text->Length; ++pos )
  {
    wchar_t cc = text[pos];
    if( Char::IsWhiteSpace( cc ) )
    {
      if( !inWhitespace )
      {
        if( pos > posStart ) newText += text->Substring( posStart, pos - posStart );
        inWhitespace = true;
        newText += L' ';
      }
      posStart = pos + 1;
    }
    else
    {
      if( inWhitespace )
      {
        inWhitespace = false;
        posStart = pos;
      }
    }
  }

  if( pos > posStart ) newText += text->Substring( posStart, pos - posStart );

  return( newText );
}

我首先通过分别替换每个字符来尝试上述例程,但是不得不切换到对非空格部分进行子字符串处理。当应用到1,200,000字符串时:

  • 上面的例程在25秒内完成
  • 上面的例程+ 95秒内单独替换字符
  • 正则表达式在15分钟后中止。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.