Правка текста с помощью регулярок
Строку вида "санкт-петербург" нужно привести к виду "Санкт-Петербугрг". В Delphi метод Replace не допускает передачи лямбды, т.е. нельзя просто взять и записать нечто вроде:
var
s : AnsiString;
begin
s := 'санкт-петербург';
s := TRegEx.Replece(s, '\b(\p{L})', function(c: string): string
begin
// заменяем первую букву слова на заглавную
end;)
Как наиболее эффективно заменить буквы на заглавные?
Ответы (1 шт):
Если использовать регулярные выражения - безальтернативный вариант, то вот пример по схеме, предложенной @Алексей Р
function TForm1.MatchEvaluator(const Match: TMatch): string;
begin
Result := Match.Groups[1].Value.ToUpper() + // the 1st letter of the 1st part
Match.Groups[2].Value + // the rest of the 1st part
Match.Groups[3].Value + // delimiter
Match.Groups[4].Value.ToUpper() + // the 1st letter of the 2nd part
Match.Groups[5].Value + // the rest of the 2nd part
end;
function TForm1.Button2Click(Sender: TObject);
begin
const input = 'сАнкТ-пеТерБург';
var result := TRegEx.Replace(input.ToLower(), '(\p{L})(\p{L}*)(\-)(\p{L})(\p{L}*)', MatchEaluator);
ShowMessage(result);
end;
Но я не уверен, что для данной задачи стоит использовать регулярные выражения. А ещё бывают имена и посложнее, например, Ростов-на-Дону.
P.S. Я использовал Inline Variable Declaration. В старых версиях Delphi (ниже 10.3) недоступно.
Update. Модификаторы регистра поддерживаются в регулярках Delphi (во всяком случае, в 12 Athens).
function TForm1.Button1Click(Sender: TObject);
begin
const input = 'сАнкТ-пеТерБург';
var result := TRegEx.Replace(input, '(\p{L})(\p{L}*)', '\U1\L2');
ShowMessage(result);
end;