我如何从特定文本中提取第一个字符串

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> 后的所有文本。使用 PosCopy 例如:

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-fancrack-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);