江苏省苏州市昆山市朝阳北路88号林市大厦6楼;
上海市闵行区龙吴路1100弄111号;
安徽省阜阳市太和县插花镇胡海庄50户-2;
有没有一个含税可以返回上面地址的,省、市、区、县、镇,镇后面的统一为地址。
尤其是第一个地址比较难搞啊,里面有多个市不好判断额,老师们给个例子学习下。
简单的拆分用下面的代码就能做到, 但是类似 林市大厦 这种就无法分辨了, 只能作为一个市名去拆
真要是想准确, 就穷举出所有省/市数据, 取出来时做匹配判断, 网上能找到相关的库
procedure TForm1.Button1Click(Sender: TObject);
const
nSA: Array[0..4] of string = ('省','市','区','县','镇');
var
nStr, nText: string;
nIndex, nPI, nL: Integer;
begin
Memo1.Lines.Clear;
nText := string(Edit1.Text);
nPI := 0;
for nStr in nSA do
begin
nL := nStr.Length;
nIndex := nText.IndexOf(nStr, nPI);
while nIndex > -1 do
begin
Memo1.Lines.Add(nText.Substring(nPI, nIndex + nL - nPI));
nPI := nIndex + nL;
nIndex := nText.IndexOf(nStr, nPI);
end;
end;
Memo1.Lines.Add(nText.Substring(nPI, nText.Length));
end;
这只用拆分的方法不行,还加地名词典才能完美解决。地名词典要专门管理包括新加,更新,发布等。
假设根据中国人的习惯,街道门牌一定写在行政区划后面,高一级行政区划写在低一级前面,也就是不会写
开封市河南省xx县xx镇xxx大队这样颠倒的。
同时可能遗漏某一级的行政区划,比如有人写
开封市xx县xx镇xxx(忽略河南)
或者河南省xx县xx镇xxxx
解决你问题的思路是,首先从你的地址里面解析最高级的行政区划,可以根据
https://github.com/cn/GB2260
提供的行政区划表的数据去找,先找省,再找地级市,再找县/县级市……
如果找到了,那么下一级行政区域在这个上一级的范围内找。如果找不到,就找再下一级……
找到以后,再根据这个行政区找它前面缺失的。
在找到省、市、区县、街道镇之后,提取原来地址后面其余的部分加上去。