给定字符串“ 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%。正则表达式。
更新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(); }