Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 提取多个子串_String_Delphi - Fatal编程技术网

String 提取多个子串

String 提取多个子串,string,delphi,String,Delphi,我这里有一个字符串123 Wegomamamiago YouletMegomamamamiAtoloveYousomamamamamiasoihateYoumamamamamamamiahey我怎样才能得到所有可用的mamamamia+2字符串长度?我需要:MAMAMIAGO,MAMAMIASO,等等 我的问题是,在发现的最后一个子串上,给了我错误的输出。它以给定的子字符串长度呈现字符串的开头:123 Herewe而不是MAMAMIAGO 我正在使用: 您将匹配文本添加到错误的位置,而没有检查添

我这里有一个字符串123 Wegomamamiago YouletMegomamamamiAtoloveYousomamamamamiasoihateYoumamamamamamamiahey我怎样才能得到所有可用的mamamamia+2字符串长度?我需要:MAMAMIAGO,MAMAMIASO,等等

我的问题是,在发现的最后一个子串上,给了我错误的输出。它以给定的子字符串长度呈现字符串的开头:123 Herewe而不是MAMAMIAGO

我正在使用:


您将匹配文本添加到错误的位置,而没有检查添加的匹配是否超过字符串长度

当进入while循环时,要做的第一件事是检查添加的匹配项是否没有超过搜索字符串长度。然后可以在开始新搜索之前添加匹配项

procedure ExtractSubStringsPlus2(const SubString, SearchString: string; list: TStringList);
// Extract found sub strings together with the next two characters into a list
// Use StrUtils.PosEx if Delphi version is older than XE3
var
  offset,len: integer;
begin
  list.Clear;
  len := Length(SubString);
  offset := Pos(Substring, SearchString, 1);
  while offset <> 0 do
  begin
    // Test if added length is past length of search string
    if (offset + len + 1 > Length(SearchString))
      then break;
    // Copy found match
    list.Add(Copy(SearchString,offset,len+2));
    // Continue search
    offset := Pos(Substring, SearchString, offset + len);
  end;
end;

您的问题如添加的注释中所述:

function Occurrences(const Substring, Text: string): Integer;
    var
      offset: Integer;
    begin
      Result := 0;
      offset := PosEx(Substring, Text, 1);

      while offset <> 0 do
      begin
        inc(Result);
        offset := PosEx(Substring, Text, offset + Length(Substring));
        // If the string isn't found any more, offset becomes 0, but
        // you still add a new string to the memo...
        memo1.Lines.Add(Copy(Text, offset, Length(Substring)+2));
      end;
    end;

使用TstringList的一种非常简单的方法:

Var aList: TstringList;
    i: integer;
begin
  aList := TstringList.create;
  try
    aList.lineBreak := 'MAMAMIA';
    aList.text := 'x' + '123HEREWEGOMAMAMIAGOWILLYOULETMEGOMAMAMIATOLOVEYOUSOMAMAMIASOIHATEYOUMAMAMIAHEY';
    For I := 1 to aList.count-1 do
      if length(aList[i]) >=2 then memo1.Lines.Add(aList.lineBreak + Copy(aList[i], 1, 2));  
  finally
    aList.free;
  end;
end;

无论PosEx在上一次迭代中返回的是什么,您都将文本添加到备忘录中。PosEx返回偏移量0,但您将从该偏移量添加文本。您错过了第一次,并在末尾复制了一个伪造的文本。解决这个问题的方法是在循环中,在添加到备忘录的行之后,调用PosEx。我建议您考虑使用调试器来了解程序正在做什么。使用正则表达式,而不是循环。让正则表达式来做,并在匹配中进行迭代。似乎您没有按照上一个问题中的建议进行操作。调试是一项重要的学习技能。请看我的答案,第一个问题已经给出了解决方案。几天前你也有一个类似的问题。这不是回答了你之前的问题吗?你测试过了吗?没有,但我认为他们没有理由这不起作用可能需要检查复制者[i],1,2如果是空字符串,我不知道如果“MAMAMIA”在课文的结尾怎么办?然后用“x”+“123在这里你会让Megomamamiagoo看到YousomamamamiasoihateYoumamamamamiaheymamamamamiam”。它也会列出“MAMAMIAM”,但这是错误的。为什么MAMAMIAM是错误的?这是他想要的+2个字符在这里他们只有1个,但他没有说它必须至少有2个字符。。。else add if lengthaList[i]>=2然后..我花了一段时间才理解循环到底发生了什么。我现在明白了。干得好,先生,非常感谢。此代码正在运行,谢谢您的帮助。我选择了第一个答案,勒德先生昨天指导我回答上一个问题。再次感谢。
function Occurrences(const Substring, Text: string): Integer;
    var
      offset: Integer;
    begin
      Result := 0;
      offset := PosEx(Substring, Text, 1);

      while offset <> 0 do
      begin
        inc(Result);
        offset := PosEx(Substring, Text, offset + Length(Substring));
        // If the string isn't found any more, offset becomes 0, but
        // you still add a new string to the memo...
        memo1.Lines.Add(Copy(Text, offset, Length(Substring)+2));
      end;
    end;
FUNCTION Occurrences(CONST SubString,Text : STRING): Cardinal;
  CONST
    HellFreezesOver     = FALSE;

  VAR
    OFS                 : Cardinal;

  BEGIN
    Result:=0; OFS:=0;
    REPEAT
      OFS:=PosEx(SubString,Text,OFS+1);
      // Here I terminate the loop, in case the string isn't found any more.
      IF OFS=0 THEN BREAK;
      INC(Result);
      Memo1.Lines.Add(COPY(Text,OFS,LENGTH(SubString)+2))
    UNTIL HellFreezesOver
  END;
Var aList: TstringList;
    i: integer;
begin
  aList := TstringList.create;
  try
    aList.lineBreak := 'MAMAMIA';
    aList.text := 'x' + '123HEREWEGOMAMAMIAGOWILLYOULETMEGOMAMAMIATOLOVEYOUSOMAMAMIASOIHATEYOUMAMAMIAHEY';
    For I := 1 to aList.count-1 do
      if length(aList[i]) >=2 then memo1.Lines.Add(aList.lineBreak + Copy(aList[i], 1, 2));  
  finally
    aList.free;
  end;
end;