Почему TRegEx.split вернул пустую строку в качестве первого элемента?

  • Моя строка: {name}text.
  • Мой RegExp: TRegEx.split('{name}text', '\{(.*)\}');

И мой результат:

[empty]
name
text
0
J. Doe 26 Сен 2018 в 05:58

2 ответа

Лучший ответ

Поскольку перед разделителем стоит пустое совпадение нулевой длины, оно будет добавлено к результату. Это похоже на большинство известных мне реализаций регулярных выражений. К сожалению, в документации Delphi этого не говорится.

Обратите внимание, что ваш шаблон будет перекрываться, если есть несколько строк {...} из-за того, что .* является жадным - лучше используйте \{(.*?)\} или \{[^{}]*\}. Сравните результаты в строке вида a{b}c{d}e:

var
  S: string;
begin
  for S in TRegex.Split('a{b}c{d}e', '\{(.*)\}') do
  begin
    WriteLn(S);   //->['a','b{c}d','e']
  end;
  WriteLn('-------------------');
  for S in TRegex.Split('a{b}c{d}e', '\{(.*?)\}') do
  begin
    WriteLn(S);  //-> ['a','b','c','d','e']
  end;
  ReadLn;
end.
1
Sebastian Proske 26 Сен 2018 в 06:34

Окончательный код без пустых элементов:

for buf in TRegEx.split(str, '\{(.*?)\}') do
  if (buf <> '') then matches := matches + [buf];
0
J. Doe 27 Сен 2018 в 09:52