【问题标题】:Check if MyString[1] is an alphabetical character?检查 MyString[1] 是否是字母字符?
【发布时间】:2011-07-07 12:08:26
【问题描述】:

我有一个字符串,我们称之为MyStr。我试图摆脱字符串中的每个非字母字符。例如,在 MSN 和 Skype 等 IM 中,人们将他们的显示名称设为 [-Bobby-]。我想删除该字符串中不是字母字符的所有内容,所以我只剩下“名称”。

如何在 Delphi 中做到这一点?我正在考虑创建一个TStringlist 并将每个有效字符存储在其中,然后使用IndexOf 检查字符是否有效,但我希望有一种更简单的方法。

【问题讨论】:

  • TStringList 听起来非常效率低下...
  • @Jeff - 您只需要处理 Ansi 字符串(英文字符)还是 Unicode 字符?
  • @Ken - 我也需要像“æ ø å”这样的字符。
  • @Jeff 你不需要以“Hello SO”开始你的所有问题,也不需要签字,因为我们可以在 Q 下看到你的名字和面部照片。另外,使用两个换行符来创建段落。我已经编辑了你的问题。无论如何+1,好Q。
  • @David - 只是礼貌:P

标签: string delphi char character


【解决方案1】:

最简单的方法是

function GetAlphaSubstr(const Str: string): string;
const
  ALPHA_CHARS = ['a'..'z', 'A'..'Z'];
var
  ActualLength: integer;
  i: Integer;
begin
  SetLength(result, length(Str));
  ActualLength := 0;
  for i := 1 to length(Str) do
    if Str[i] in ALPHA_CHARS then
    begin
      inc(ActualLength);
      result[ActualLength] := Str[i];
    end;
  SetLength(Result, ActualLength);
end;

但这只会将英文字母视为“字母字符”。它甚至不会将极其重要的瑞典字母 Å、Ä 和 Ö 视为“字母字符”!

稍微复杂一点的是

function GetAlphaSubstr2(const Str: string): string;
var
  ActualLength: integer;
  i: Integer;
begin
  SetLength(result, length(Str));
  ActualLength := 0;
  for i := 1 to length(Str) do
    if Character.IsLetter(Str[i]) then
    begin
      inc(ActualLength);
      result[ActualLength] := Str[i];
    end;
  SetLength(Result, ActualLength);
end;

【讨论】:

  • @Andreas - +1!是否可以包括 Æ Ø Å 和那些?谢谢!
  • 在第一种方法中,您可以将它们添加到集合中 ('Æ', 'Ø', 'Å', 'Ä', 'Ö', 'å', 'ä', 'ö')。后一种方法使用IsLetter,将自动包含所有语言的所有字母。
  • @Jeff GetAlphaSubstr2 就是这样做的
  • +1 完美。我会编写与GetAlphaSubstr2 相同的代码。
  • @David - 啊,太好了!现在会这样做! :) 必须对其进行修改,以便在提取名字后将所有内容都丢弃。
【解决方案2】:

试试这个代码来检查一个字符是否是一个字母字符。

  MyStr:='[-Bobby-]';
  //is an alphabetical character ?
  if MyStr[1] in ['a'..'z','A'..'Z'] then

要从字符串中删除所有非字母字符(英文字符),您可以使用类似的内容。

NewStr:='';
for i := 1 to Length(MyStr) do
 if MyStr[i] in ['a'..'z','A'..'Z'] then
   NewStr:=NewStr+MyStr[i];

现在NewStr 变量只包含字母字符。

在较新版本的 delphi 中,您可以使用 Character.IsLetter 函数。

【讨论】:

  • 覆盖 A..Z 范围之外的其余字母字符的区域设置版本怎么样?
  • @jeroen,答案指出...to remove from a string all the non alphabetical characters (English characters) 覆盖OP 可以使用Character.IsLetter 函数的其余字母字符,或者只是使用附加字符扩展集合,如评论中的安德烈亚斯解释。
【解决方案3】:

我有一整套优化的字符串例程来完成这些工作,它们可以与 Unicode 和非 Unicode Delphi 一起使用。最相关的两个是:

function CsiRemoveArgs(const pInStr: string; const pArgs: string;
                       pRestrictToArgs: Boolean = False): string;
function CsiRemoveArgs(const pInStr: string; pArgs: TSysCharSet;
                       pRestrictToArgs: Boolean = False): string;

您可以下载它们here

【讨论】:

  • +1 表示允许覆盖 A..Z 范围之外的其余字母字符的例程。
【解决方案4】:

完美解决方案:

Result := TRegEx.Replace('Input12231213','[^a-zA-Z]+','');  // Result = 'Input'

在 Delphi XE 中工作

http://regexpstudio.com

【讨论】:

  • 即使在美国,人们也应该不那么天真。
猜你喜欢
  • 1970-01-01
  • 2013-04-01
  • 2012-04-23
  • 2014-08-03
  • 1970-01-01
  • 2015-01-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多