DELPHI STRING:从全名中提取姓氏

前端之家收集整理的这篇文章主要介绍了DELPHI STRING:从全名中提取姓氏前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图操纵一个字符串,只从中拉出某些数据.我需要在从数据库提取的记录中执行此操作,该数据库为我提供了一个人的全名.我只需从字符串中提取姓氏并将其存储为变量.有没有办法可以做到这一点?

示例:SQL查询提取完整字段“Mary Ellen Jones”我需要从字符串中仅提取Jones,以便将其存储在变量中以便进一步处理.

我想也许AnsiRightStr可以工作,但问题是需要给它一个设置整数从右边拉.也许在最终空间之后计算字符的方法允许我为此使用AnsiRightStr(string,int)?任何帮助都表示赞赏.

另外想一想:用分隔符替换空格是否说::然后将该数据解析为Stringlist,然后允许我拉出字符串列表的最后一个索引?

到目前为止已经提出了几个有效的选项.如果说名字是“John St. James,Jr.”之类的东西,他们都不会解决这种情况.这不可能吗?

解决方法

What if the last name is say “St. James” any way to account for that?

这是我的方法.

>列出姓氏标记
>按优先顺序搜索该列表
>一旦找到匹配项,请将其标记为姓氏的开头
>从该pos开始返回子串.

var
  LastNameMarkers: TStringList = nil;
  SuffixFix: TStringList = nil;
procedure InitLists;
begin
  LastNameMarkers:= TStringList.Create;
  //LastNameMarkers.LoadFromFile('c:\markers.txt');
  LastNameMarkers.Add(' St.');
  LastnameMarkers.Add(' Mc');
  LastNameMarkers.Add(' '); //Marker of last resort.
  SuffixFix:= TStringList.Create;
  SuffixFix.Add(' Jr.');
  SuffixFix.Add(' Sr.');
end;

function GetLastName(FullName: string): string;
var
  i: integer;
  start: integer;
  found: boolean;
  ReplaceWith: string;
begin
  if LastNameMarkers = nil then InitLists;

  //Fix suffixes
  i:= 0;
  found:= false;
  while (i < SuffixFix.Count) and not found do begin
    start:= pos(lower(LastNameMarkers[i]),lower(Fullname));
    found:= Start > 0;
    Inc(i);
  end; {while}
  if Found then begin 
    Dec(i);
    ReplaceWith:= StringReplace(Suffix[i],' ','_',[]);
    FullName:= StringReplace(FullName,SuffixFix[i],ReplaceWith,[]);
  end; {if}

  //Look for lastnames 
  i:= 0;
  found:= false;
  while (i < LastNameMarkers.Count) and not found do begin
    start:= pos(LastNameMarkers[i],Fullname);
    found:= Start > 0;
    Inc(i);
  end; {while}

  if found then Result:= RightStr(FullName,Length(FullName)- Start + 2)
  else Result:= '';

  StringReplace(Result,[]);
end;

我没有正确处理大写和小写,但我希望你能得到这个想法.

猜你在找的Delphi相关文章