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

时间:2015-04-21 06:43:00

标签: delphi delphi-xe7

我需要从文本中提取字符串,如下例

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>

4 个答案:

答案 0 :(得分:5)

当我读到您所写的内容时,您有一个字符串,并且您希望在第一次出现<z>后忽略所有文本。例如,使用PosCopy

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