小编典典

在大写字母之前添加空格

c#

给定字符串“
ThisStringHasNoSpacesButItDoesHaveCapitals”,什么是在大写字母前添加空格的最佳方法。因此,结束字符串将为“此字符串没有空格,但确实有大写字母”

这是我对RegEx的尝试

System.Text.RegularExpressions.Regex.Replace(value, "[A-Z]", " $0")

阅读 1436

收藏
2020-05-19

共1个答案

小编典典

正则表达式可以很好地工作(我什至投票赞成马丁·布朗的答案),但是它们很昂贵(而且我个人发现任何模式都比几个字符长得令人讨厌的更长)

该功能

string AddSpacesToSentence(string text, bool preserveAcronyms)
{
        if (string.IsNullOrWhiteSpace(text))
           return string.Empty;
        StringBuilder newText = new StringBuilder(text.Length * 2);
        newText.Append(text[0]);
        for (int i = 1; i < text.Length; i++)
        {
            if (char.IsUpper(text[i]))
                if ((text[i - 1] != ' ' && !char.IsUpper(text[i - 1])) ||
                    (preserveAcronyms && char.IsUpper(text[i - 1]) && 
                     i < text.Length - 1 && !char.IsUpper(text[i + 1])))
                    newText.Append(' ');
            newText.Append(text[i]);
        }
        return newText.ToString();
}

它将在9686.850个滴答声中执行100,000次,正则表达式将花费25,000,000个滴答声(并且已编译正则表达式)。

给定更好(即更快)的值会更好,但是需要维护更多代码。“更好”通常是竞争需求的折衷方案。

希望这可以帮助 :)

更新
自从我看了好一阵子以来,我才意识到自从代码更改(只是更改了一点)以来,时序没有更新。

在具有“
Abbbbbbbbb”的字符串重复100次(即1,000个字节)的情况下,运行100,000次转换需要手工编码函数4,517,177个滴答,而下面的正则表达式则需要59,435,719个滴答声,使得手工编码函数的运行时间为7.6%。正则表达式。

更新2是否 会考虑首字母缩写词?现在会!if陈述的逻辑相当模糊,因为您可以看到将其扩展到此…

if (char.IsUpper(text[i]))
    if (char.IsUpper(text[i - 1]))
        if (preserveAcronyms && i < text.Length - 1 && !char.IsUpper(text[i + 1]))
            newText.Append(' ');
        else ;
    else if (text[i - 1] != ' ')
        newText.Append(' ');

…根本没有帮助!

这是不用担心缩写词的原始 简单 方法

string AddSpacesToSentence(string text)
{
        if (string.IsNullOrWhiteSpace(text))
           return "";
        StringBuilder newText = new StringBuilder(text.Length * 2);
        newText.Append(text[0]);
        for (int i = 1; i < text.Length; i++)
        {
            if (char.IsUpper(text[i]) && text[i - 1] != ' ')
                newText.Append(' ');
            newText.Append(text[i]);
        }
        return newText.ToString();
}
2020-05-19