我试图操纵一个字符串,只从中拉出某些数据.我需要在从数据库中提取的记录中执行此操作,该数据库为我提供了一个人的全名.我只需从字符串中提取姓氏并将其存储为变量.有没有办法可以做到这一点?
示例: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;
我没有正确处理大写和小写,但我希望你能得到这个想法.