如何将字符串分成两部分

时间:2016-02-21 09:47:26

标签: delphi

我输入了一个字符串,例如{ !move simon General Chat } 我想从字符串中删除第一个和第二个完整的短语,无论大小。以下代码仅适用于General Chat,但如果我将此“区域ID”更改为Romancespacegames则无效。

我应该更改代码?

if UpperCase(Mid(source,1,5)) = UpperCase('!move') then
begin
  User := Mid(source, 6, length(source)); // remove !move from username
  RoomID := Mid(source, length(User)-6, length(source)); // remove !move and username
  SendMemo.Clear;
  MoveUserTo(IMData.m_UserID, GetFirstNWrods(User, ' ', 1), GetFirstNWrods(RoomID, ' ', 3));
end;

function GetFirstNWrods(const str: string; const delim: string; Numwords: Integer): string;
var
  Tokenizer: IStringTokenizer;
begin
  Result := '';
  Tokenizer := StringTokenizer(str, delim);
  while (Tokenizer.hasMoreTokens) and (Numwords > 0) do
  begin
    Result := Result + Tokenizer.nextToken + delim;
    Dec(Numwords)
  end;
  System.Delete(Result, Length(Result) - Length(delim) + 1, Length(delim));
end;

1 个答案:

答案 0 :(得分:1)

您的解决方案适用于General Chat只是巧合。 在代码的第三行:

User := Mid(source, 6, length(source)); // remove !move from username

您实际上将所有剩余的字符串User复制到simon General Chat。在下一行:

RoomID := Mid(source, length(User)-6, length(source)); // remove !move and username
发生了一些奇怪的事情。用户的长度比源的长度小6,现在你将RoomID正好位于12个正确的位置,这不取决于你的字符串的实际内容。

因此,如果RoomID长度为11或12个符号,则代码正常工作(如果有的话,前导空格将被删除)。真是一个惊喜:General chat长度为12,所以它有效。

您实际需要做的是逐字阅读User变量并检查每一步,是否有用户具有此类名称。为了明确地工作,你应该永远不要让用户的名字包含开头的另一个用户的名字(这就是Jan Doggen告诉你的)。例如,如果您有用户simon,则不应允许任何其他人使用用户名simon paul,否则解析您的命令要困难得多。

因此,您逐字阅读,直到它产生现有的用户名。现在剩下的就是你的RoomID。