我需要正则表达式帮助,创建一个delphi函数来替代Rad Studio XE2中的HyperString ParseWord函数。 HyperString是一个非常有用的字符串库,但它从未跨越到Unicode。我已经基本上完成了它,但它根本不尊重引号定界符。我需要它完全匹配下面描述的函数:
function ParseWord(const Source,Table:String;var Index:Integer):String; 顺序从左到右使用单个字符分隔符表进行标记解析。在引号字符串中忽略定界符。表中不允许使用引号定界符。 索引是一个指针(初始化为“1”表示第一个单词)由该函数更新以指向下一个单词。要检索下一个单词,只需使用先前返回的Index值再次调用函数即可。 注意:如果Length(Resultant)= 0,则没有其他单词可用。定界符在引号字符串中被忽略。(我的强调)
这是截至目前为止的内容:
function ParseWord(const Source,Table:String;var Index:Integer):String; 顺序从左到右使用单个字符分隔符表进行标记解析。在引号字符串中忽略定界符。表中不允许使用引号定界符。 索引是一个指针(初始化为“1”表示第一个单词)由该函数更新以指向下一个单词。要检索下一个单词,只需使用先前返回的Index值再次调用函数即可。 注意:如果Length(Resultant)= 0,则没有其他单词可用。定界符在引号字符串中被忽略。(我的强调)
这是截至目前为止的内容:
function ParseWord( const Source, Table: String; var Index: Integer):string;
var
RE : TRegEx;
match : TMatch;
Table2,
chars : string;
begin
if index = length(Source) then
begin
result:= '';
exit;
end;
// escape the special characters and wrap in a Group
Table2 :='['+TRegEx.Escape(Table, false)+']';
RE := TRegEx.create(Table2);
match := RE.Match(Source,Index);
if match.success then
begin
result := copy( Source, Index, match.Index - Index);
Index := match.Index+match.Length;
end
else
begin
result := copy(Source, Index, length(Source)-Index+1);
Index := length(Source);
end;
end;
while ( Length(result)= 0) and (Index<length(Source)) do
begin
Inc(Index);
result := ParseWord(Source,Table, Index);
end;
干杯并感谢。