求在字符串中提取身份证号的最佳算法。(50)

  • 主题发起人 主题发起人 海无崖
  • 开始时间 开始时间

海无崖

Unregistered / Unconfirmed
GUEST, unregistred user!
我想在任意一段长文本中提取所有的包涵的身份证号信息。比如,文本为:“中轼械苛栽栽asdfas511927197010250112asa,wek asf3w23a swef3452qwe31192719701025011xas324r”就可以取出511927197010250112和31192719701025011x这两个身份证号。哪位大侠可以提供最优的算法,请帖出详细代码,谢谢了!
 
回楼上的,因为这个包涵字符串文件可能有十万多条行,没有算法,岂不慢死了。
 
用正则表达式,不需要什么算法procedure TForm1.Button1Click(Sender: TObject);var Matches, MyTest: OleVariant; NewTestStr, TestStr: string; i: integer;begin TestStr := '网址:http://www.ainlife.cn/ 电话:0728-63667921; MyTest := CreateOleObject('VBScript.RegExp'); MyTest.Global := True; MyTest.IgnoreCase := True; MyTest.Pattern := '[/d]{3,4}-[/d]{6,11}'; //匹配一个电话号码 if MyTest.Test(TestStr) then ShowMessage('找到了电话号码'); Matches := MyTest.Execute(TestStr); //执行查找; for i := 1 to Matches.count do //显示找到的结果 begin ShowMessage(Format('找到的第%d个:%s', [i, Matches.item[i - 1]])); end; //以下是将字符串中的电话号码改为新的号码。 NewTestStr := MyTest.Replace(TestStr, '0769-85787641'); ShowMessage(NewTestStr);end;以上是个提取字符串中的电话号码的例子,只需要把 MyTest.Pattern := '[/d]{3,4}-[/d]{6,11}'; 中的内容作一点修改就可以了,具体参考VBS的正则表达式的帮助。MyTest.Pattern := '/^[1-9]/d{5}[1-9]/d{3}((0/d)|(1[0-2]))(([0|1|2]/d)|3[0-1])((/d{4})|/d{3}[A-Z])$/'这个是网上的18位身份证号码的正则表达式规则。我没有测试过。
 
delphi使用正则表达式单元RegExpr.pas,可以一次性搜索出来符合条件的内容。非常适合你!
 
刚才没有给你贴代码,你现在看一下代码就会明白了,呵呵可能你还不知道有正则表达式这个玩意吧。
 
因为这个包涵字符串文件可能有十万多条行,没有算法,岂不慢死了。//////////////delphi 自己本身就用了算法,速度挺快
 
Vsun,我太感谢您了!!!真是大侠。我的确还不知道有这个功能。
 
散分了。
 
不好意思,分散错了。[:(]
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部