Правка текста с помощью регулярок

Строку вида "санкт-петербург" нужно привести к виду "Санкт-Петербугрг". В Delphi метод Replace не допускает передачи лямбды, т.е. нельзя просто взять и записать нечто вроде:

var
  s : AnsiString;
begin
  s := 'санкт-петербург';
  s := TRegEx.Replece(s, '\b(\p{L})', function(c: string): string
  begin
    // заменяем первую букву слова на заглавную
  end;)

Как наиболее эффективно заменить буквы на заглавные?


Ответы (1 шт):

Автор решения: Old Skull

Если использовать регулярные выражения - безальтернативный вариант, то вот пример по схеме, предложенной @Алексей Р

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;
→ Ссылка