在大写字母之前添加空格

给定字符串“

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

这是我对RegEx的尝试

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

回答:

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

该功能

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%。正则表达式。

会考虑首字母缩写词?现在会!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();

}

以上是 在大写字母之前添加空格 的全部内容, 来源链接: utcz.com/qa/433463.html

回到顶部