我需要从文本中提取字符串,如下例
Hi i have no name <z>empty</z>
我想只将<z>
之前的文本提取到hi i have no name
的数组或字符串中
我试过这个功能
procedure Split (const Delimiter: Char; Input: string; const Strings: TStrings);
begin
Assert(Assigned(Strings)) ;
Strings.Clear;
Strings.StrictDelimiter := true;
Strings.Delimiter := Delimiter;
Strings.DelimitedText := Input;
end;
但它只能分割像;,:
等字符。我想用这个特定字符串开始拆分<z>
答案 0 :(得分:5)
当我读到您所写的内容时,您有一个字符串,并且您希望在第一次出现<z>
后忽略所有文本。例如,使用Pos
和Copy
:
P := Pos('<z>', input);
if P = 0 then
output := input
else
output := Copy(input, 1, P-1);
虽然有些东西告诉我你真的想要一个XML解析器。
答案 1 :(得分:2)
使用字符串帮助程序的例子:
function CutString(const input,pattern: String): String;
var
p: Integer;
begin
p := input.IndexOf(pattern);
if (p >= 0) then
Result := input.Substring(0,p)
else
Result := input;
end;
var
s: string;
begin
s := 'Hi i have no name<z>empty</z>';
s := CutString(s,'<z>');
WriteLn(s); // Outputs: 'Hi i have no name'
end.
答案 2 :(得分:1)
以下是 one-liner-fan , crack-nuts-with-sledgehammer-lover , regex-enthusiast , waste-performance-ignorant 和 xml-parser-grump :
TRegEx.Replace('Hi i have no name <z>empty</z>', '((^.*)(?=<z>)|(^.*)(?!<z>)).*', '$1');
答案 3 :(得分:0)
如果分隔符肯定在那里,你可以这样做:
Result:= Copy(S, 1, Pos(Delimiter, S) - 1);
否则用户戴维斯回答或者这个(更短但性能不好):
Result:= Copy(S, 1, Pos(Delimiter, S + Delimiter) - 1);