Решение RegEx определенно более элегантно, чем то, что я создал. Тем не менее, использование StringBuilder, как правило, немного быстрее и не требует поиска термина и пре- / пост-исправлений, которые необходимо экранировать регулярными выражениями.
private static string Surround(string original, string head, string tail, string match, StringComparison comparisonType)
{
if (string.IsNullOrEmpty(original) || string.IsNullOrEmpty(match) || (string.IsNullOrEmpty(head) && string.IsNullOrEmpty(tail)))
return original;
var resultBuilder = new StringBuilder();
int matchLength = match.Length;
int lastIdx = 0;
for (;;)
{
int curIdx = original.IndexOf(match, lastIdx, comparisonType);
if (curIdx > -1)
resultBuilder
.Append(original, lastIdx, curIdx - lastIdx)
.Append(head)
.Append(original, curIdx, matchLength)
.Append(tail);
else
return resultBuilder.Append(original.Substring(lastIdx)).ToString();
lastIdx = curIdx + matchLength;
}
}
Я надеюсь, что вы можете использовать его.
Обновление
Пройдя небольшой тест, я думаю, что мое решение будет быстрее, если вы ищете «короткие» слова. Если слово длинное (т.е. длина> 7), Regex выигрывает, но если слово короткое (т.е. длина <7), тогда мое решение выигрывает. Кто-нибудь знает, почему это? Какая операция так чувствительна к длине? Это IndexOf (string, int, int) или, возможно, Append (string, int, int)? </p>