2012-03-23 3 views
1

Что является самым простым и быстрым способом найти подстроку (шаблон) в строке и заменить ее чем-то еще после буквы письма шаблона (если все нижние регистры - заменить на в нижнем регистре, если все в верхнем регистре - заменить верхний регистр, если начинается с заглавных и так далее ...)Найти подстроку, заменить подстроку в соответствии с регистром

так, если подстрока в фигурные скобки

"{template}" becomes "replaced content" 
"{TEMPLATE}" becomes "REPLACED CONTENT" and 
"{Template}" becomes "Replaced content" but 
"{tEMPLATE}" becomes "rEPLACED CONTENT" 
+1

Если не все символы в нижних/верхних - просто пропустить подстроку вхождения? – sll

+0

если шаблон установлен в моде «Camel case», просто определите остальных, изучив первые две буквы ... о, geee ... Я просто понял - в любое время это зависит только от пары ведущих букв – Agzam

+0

Это только 4 случая? Или у вас больше, например, '{tEmPlAte}' и т. Д.? – code4life

ответ

0

Законченных делать, что:

public static string ReplaceWithTemplate(this string original, string pattern, string replacement) 
{ 
    var template = Regex.Match(original, pattern, RegexOptions.IgnoreCase).Value.Remove(0, 1); 
    template = template.Remove(template.Length - 1); 
    var chars = new List<char>(); 
    var isLetter = false; 
    for (int i = 0; i < replacement.Length; i++) 
    { 
    if (i < (template.Length)) isLetter = Char.IsUpper(template[i]); 
    chars.Add(Convert.ToChar(
         isLetter ? Char.ToUpper(replacement[i]) 
           : Char.ToLower(replacement[i]))); 
    } 

    return new string(chars.ToArray()); 
} 
0

Вы можете проверить случай первых двух буквы заполнителя и выбрать одну из четырех стратегий преобразования текста для вставленного текста.

public static string Convert(string input, bool firstIsUpper, bool restIsUpper) 
{ 
    string firstLetter = input.Substring(0, 1); 
    firstLetter = firstIsUpper ? firstLetter.ToUpper() : firstLetter.ToLower(); 
    string rest = input.Substring(1); 
    rest = restIsUpper ? rest.ToUpper() : rest.ToLower(); 
    return firstLetter + rest; 
} 

public static string Replace(string input, Dictionary<string, string> valueMap) 
{ 
    var ms = Regex.Matches(input, "{(\\w+?)}"); 
    int i = 0; 
    var sb = new StringBuilder(); 
    for (int j = 0; j < ms.Count; j++) 
    { 
     string pattern = ms[j].Groups[1].Value; 
     string key = pattern.ToLower(); 
     bool firstIsUpper = char.IsUpper(pattern[0]); 
     bool restIsUpper = char.IsUpper(pattern[1]); 
     sb.Append(input.Substring(i, ms[j].Index - i)); 
     sb.Append(Convert(valueMap[key], firstIsUpper, restIsUpper)); 
     i = ms[j].Index + ms[j].Length; 
    } 

    return sb.ToString(); 
} 

public static void DoStuff() 
{ 
    Console.WriteLine(Replace("--- {aAA} --- {AAA} --- {Aaa}", new Dictionary<string,string> {{"aaa", "replacement"}})); 
} 
+0

хорошо, не могли бы вы рассказать мне, как обернуть его в элегантный фрагмент кода? – Agzam

+0

@Agzam 4 если заявления ... – Servy

1

Ну, вы могли бы использовать регулярные выражения и матч оценщик обратного вызова, как это:

regex = new Regex(@"\{(?<value>.*?)\}", 
    RegexOptions.CultureInvariant | RegexOptions.ExplicitCapture); 

string replacedText = regex.Replace(<text>, 
    new MatchEvaluator(this.EvaluateMatchCallback)); 

и ваш оценщик обратный вызов будет делать что-то вроде этого:

private string EvaluateMatchCallback(Match match) { 
    string templateInsert = match.Groups["value"].Value; 
    // or whatever 
    string replacedText = GetReplacementTextBasedOnTemplateValue(templateInsert); 
    return replacedText; 
} 

После того, как вы получите regex match, вы можете просто провести сравнение с регистром и вернуть правильное значение замены.

EDIT я вроде предположил, что вы пытались найти заполнители в блоке текста, а не беспокоиться о корпусе сами по себе, если ваш шаблон действует все время, то вы можете просто проверить первые два символа

string foo = "teMPLATE"; 
if (char.IsLower(foo[0])) { 
    if (char.IsLower(foo[1])) { 
     // first lower and second lower 
    } 
    else { 
     // first lower and second upper 
    } 
} 
else { 
    if (char.IsLower(foo[1])) { 
     // first upper and second lower 
    } 
    else { 
     // first upper and second upper 
    } 
} 

Я бы еще использовать регулярное выражение для соответствия замены заполнителя, но это только мне: сам и расскажет вам корпус вам нужно использовать в выражении замены заполнитель.

+0

-1. Я считаю это решение излишним. Что оправдывает использование регулярных выражений и обратных вызовов - не было бы простых утверждений if и метода a.Replace? –

Смежные вопросы