根据地址截取省市区,正则表达式

public class AddressResolution {

	/**
     * 解析地址
     * @author liuj
     * @param address
     * @return
     */
    public static List> addressResolution(String address){
        String regex="(?[^省]+省|.+自治区)(?[^自治州]+自治州|[^市]+市|[^盟]+盟|[^地区]+地区|.+区划)(?[^市]+市|[^县]+县|[^旗]+旗|.+区)?(?[^区]+区|.+镇)?(?.*)";
        Matcher m=Pattern.compile(regex).matcher(address);
        String province=null,city=null,county=null,town=null,village=null;
        List> list=new ArrayList>();
        Map row=null;
        while(m.find()){
            row=new LinkedHashMap();
            province=m.group("province");
            row.put("province", province==null?"":province.trim());
            city=m.group("city");
            row.put("city", city==null?"":city.trim());
            county=m.group("county");
            row.put("county", county==null?"":county.trim());
            town=m.group("town");
            row.put("town", town==null?"":town.trim());
            village=m.group("village");
            row.put("village", village==null?"":village.trim());
            list.add(row);
        }
        return list;
    }
//    public static void main(String[] args) {
//    	System.out.println("地址是:" + addressResolution("宁夏回族自治区银川市灵武市"));
//    }
}

参考论坛前辈的方法根据自己的情况稍作的修改,自己测试基本满足各种不按省市区的地址不过地址格式需要有一定规律比如上海市XX区的,我三级联动记录的是上海市-上海市-XX区,如果是上海市-XX区的话就不适用了

其中

String regex="(?[^省]+省|.+自治区)(?[^自治州]+自治州|[^市]+市|[^盟]+盟|[^地区]+地区|.+区划)(?[^市]+市|[^县]+县|[^旗]+旗|.+区)?(?[^区]+区|.+镇)?(?.*)";
如果需要增添选择条件,比如第一个
(?[^省]+省|.+自治区)

要增加截取国的字段可以改成

(?[^省]+省|[^国]+国|.+自治区)

你可能感兴趣的:(根据地址截取省市区,正则表达式)