为什么TRegEx.split
返回一个空字符串作为第一个元素?
{name}text
。TRegEx.split('{name}text', '\{(.*)\}');
我的结果:
[empty]
name
text
答案 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];