с целями
- а) Создание функции, которая оптимизирует производительность
- б) имеют свой собственный взгляд на CamelCase, в котором капитализированную аббревиатуре не была (я полностью согласен, что это не стандартное определение случая с верблюдом или паскалем, но это не необычное использование): «TestTLAContainingCamelCase» становится «Test TLA Containing Camel Case» (TLA = Three Letter)
поэтому я создал следующий (не регулярное выражение, многословный, но производительность ориентированной) функции
public static string ToSeparateWords(this string value)
{
if (value==null){return null;}
if(value.Length <=1){return value;}
char[] inChars = value.ToCharArray();
List<int> uCWithAnyLC = new List<int>();
int i = 0;
while (i < inChars.Length && char.IsUpper(inChars[i])) { ++i; }
for (; i < inChars.Length; i++)
{
if (char.IsUpper(inChars[i]))
{
uCWithAnyLC.Add(i);
if (++i < inChars.Length && char.IsUpper(inChars[i]))
{
while (++i < inChars.Length)
{
if (!char.IsUpper(inChars[i]))
{
uCWithAnyLC.Add(i - 1);
break;
}
}
}
}
}
char[] outChars = new char[inChars.Length + uCWithAnyLC.Count];
int lastIndex = 0;
for (i=0;i<uCWithAnyLC.Count;i++)
{
int currentIndex = uCWithAnyLC[i];
Array.Copy(inChars, lastIndex, outChars, lastIndex + i, currentIndex - lastIndex);
outChars[currentIndex + i] = ' ';
lastIndex = currentIndex;
}
int lastPos = lastIndex + uCWithAnyLC.Count;
Array.Copy(inChars, lastIndex, outChars, lastPos, outChars.Length - lastPos);
return new string(outChars);
}
Что было самым удивительным было тесты производительности. используя 1 000 000 итераций за функцию
regex pattern used = "([a-z](?=[A-Z])|[A-Z](?=[A-Z][a-z]))"
test string = "TestTLAContainingCamelCase":
static regex: 13 302ms
Regex instance: 12 398ms
compiled regex: 12 663ms
brent(above): 345ms
AndyRose: 1 764ms
DanTao: 995ms
метод экземпляра Regex был лишь немного быстрее, чем статический метод, даже более миллиона итераций (и я не могу видеть преимущество использования RegexOptions.Compiled флага), и очень сжатый код Дэн Тао был почти таким же быстрым, как мой гораздо менее четкий код!
Возможный дубликат [есть элегантный способ разобрать слово и добавить пробелы перед прописными буквами] (http://stackoverflow.com/questions/3103730/is-there-a-elegant-way-to-parse- a-word-and-add-spaces-before-capital-letters) –
Этот вопрос относится только к .NET, но ответы в регулярном выражении могут быть применены в другом месте. – Pat
Проверьте вопрос об ошибке: принятый ответ имеет регулярное выражение для разделения 'AnXMLAndXSLT2.0Tool' на' [An] [XML] [And] [XSLT] [2.0] [Tool] '. Он использует взгляды, которые можно утверждать, вполне читабельны. – polygenelubricants