我如何从特定文本中提取第一个字符串
how do i extract first string from specific text
我需要从文本中提取字符串,如下例
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>
当我读到你写的内容时,你有一个字符串,你想忽略第一次出现 <z>
后的所有文本。使用 Pos
和 Copy
例如:
P := Pos('<z>', input);
if P = 0 then
output := input
else
output := Copy(input, 1, P-1);
虽然有些东西告诉我你真的想要一个 XML 解析器。
只是一个使用字符串助手例程的例子:
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.
这是 one-liner-fan、crack-nuts-with-sledgehammer-lover、正则表达式爱好者,无知浪费性能和xml-解析器-grump :
TRegEx.Replace('Hi i have no name <z>empty</z>', '((^.*)(?=<z>)|(^.*)(?!<z>)).*', '');
如果定界符肯定在那里,你可以这样做:
Result:= Copy(S, 1, Pos(Delimiter, S) - 1);
否则用户 Davids 回答或这个(较短但性能不佳):
Result:= Copy(S, 1, Pos(Delimiter, S + Delimiter) - 1);
我需要从文本中提取字符串,如下例
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>
当我读到你写的内容时,你有一个字符串,你想忽略第一次出现 <z>
后的所有文本。使用 Pos
和 Copy
例如:
P := Pos('<z>', input);
if P = 0 then
output := input
else
output := Copy(input, 1, P-1);
虽然有些东西告诉我你真的想要一个 XML 解析器。
只是一个使用字符串助手例程的例子:
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.
这是 one-liner-fan、crack-nuts-with-sledgehammer-lover、正则表达式爱好者,无知浪费性能和xml-解析器-grump :
TRegEx.Replace('Hi i have no name <z>empty</z>', '((^.*)(?=<z>)|(^.*)(?!<z>)).*', '');
如果定界符肯定在那里,你可以这样做:
Result:= Copy(S, 1, Pos(Delimiter, S) - 1);
否则用户 Davids 回答或这个(较短但性能不佳):
Result:= Copy(S, 1, Pos(Delimiter, S + Delimiter) - 1);