java中的邮政地址解析器

时间:2013-12-04 05:09:12

标签: regex parsing

我正在寻找用于从文本文件中解析测试邮政地址的算法或示例代码,并将其转换为Excel报告。

我收到的文本文件将有许多不同格式的邮政地址,如下所示:

Unit 8/25 Bright ST, NSW, 2010 
UNIT 5, 77 CHAPMAL STREET
UNIT 4, 75 GREAT STREET
95 OAKILANDS WAY
AVOCADO AVE
628 BRIDGEWATER ABCE ROAD

我必须阅读此文件并将详细信息分配给变量以供进一步使用:

示例 -
来自文本地址的街道号码应该与'streetName'对应,
单位号应分配给'unitNumber'等

我有模式匹配器,如果字符串中有特定的细节,它可以识别值:

Pattern p1 = Pattern.compile("([0-9]+\\s+[aA-zZ])+.*");
Matcher m1 = p1.matcher(str);
while (m1.find()) {
    String __tmp = m1.group();
    printer = __tmp;
}
System.out.println("Street : " + printer);;

ex: - 4,75 GREAT STREET:从这个文本地址,上面的算法能够将“75 GREAT”识别为街道,但街道地址前面的数字“4”应该被标识为单位/平面/等等,无论天气如何,“4”与“单位”/“平坦”等相结合

我添加了一个模式匹配来获取街道地址之前的数字,如:

Pattern p2 = Pattern.compile("([0-9])");
Matcher m2 = p2.matcher(str);
Pattern p3 = Pattern.compile("([,])");
Matcher m3 = p3.matcher(str);
while (m2.find() & m3.find()) {
    String __tmp = m2.group();
    printer = __tmp;
}
System.out.println("Unit : " + printer);

这使我的输出为:

Street : 75 GREAT STREET
Unit : 4

但是,当我附加“unit”或“flat”等时,此算法无效。有人可以为此解决方案吗?

1 个答案:

答案 0 :(得分:0)

我会使用更灵活的两步算法:

步骤1:从文件中读取一行

BufferedReader br = new BufferedReader(new FileReader(file));
String line;
while ((line = br.readLine()) != null) {
   // process the line.
}
br.close();

第2步:处理行

在XML文件的帮助下,我会在其中添加用于从处理行中提取所需信息的各种正则表达式。

我的文件看起来像这样:

<address-templates>
    <address name="type1">
        <!-- The regex of this first type of address -->
        <regex><![CDATA[UNIT\s+(\d+),(.+)]]></regex>

        <!-- The capturing groups position of the various known parts -->
        <groups>
           <group name="unit" pos="1"/>
           <group name="street" pos="2"/>
           ...
        </groups>
    </address>

    <address name="type2">
        <!-- The regex of this second type of address -->
        <regex><![CDATA[(\d+)\s+(.+)]]></regex>

        <!-- The capturing groups position of the various known parts -->
        <groups>
           <group name="unit" pos="1"/>
           <group name="street" pos="2"/>
           ...
        </groups>
    </address>

    ...
</address-templates>

然后在我的代码中,我将解析上面的小配置文件,并针对每个地址模板检查我的line。稍后,如果出现新的地址模板,我只会更新我的小配置文件。