为什么`TRegEx.split`返回一个空字符串作为第一个元素?

时间:2018-09-26 02:58:23

标签: regex delphi

为什么TRegEx.split返回一个空字符串作为第一个元素?

  • 我的字符串:{name}text
  • 我的RegExp:TRegEx.split('{name}text', '\{(.*)\}');

我的结果:

[empty]
name
text

2 个答案:

答案 0 :(得分:1)

因为定界符前面有一个空的零长度匹配项,它将被添加到结果中。这类似于我所知道的大多数正则表达式实现。遗憾的是Delphi documentation没有注意到这一点。

请注意,如果由于{...}贪婪而存在多个.*字符串,则您的模式将重叠-而是使用\{(.*?)\}\{[^{}]*\}。在类似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 :(得分:0)

没有空元素的最终代码:

for buf in TRegEx.split(str, '\{(.*?)\}') do
  if (buf <> '') then matches := matches + [buf];