正则表达式从url中抓取特定变量

最近的一个需求,需要把网站的一些老的url做301跳转至新url,新老地址的path格式不一致,比如:

老url:
http://www.old.com/path/abc/shanghai-123/?p=xxx

新url:
http://www.new.com/path/shanghai-abc-123/?p=xxx

换一种方式表示可以看成是:

老url(其中包含两个变量):
http://www.old.com/path/abc/{cityname}-{cityid}/?p=xxx

新url(同上,但位置可能不同):
http://www.new.com/path/{cityname}-abc-{cityid}/?p=xxx

利用正则表达式抓取特定变量:

1、首先在配置中心做如下配置:
{
"match": "http://www.old.com/path/abc/",
"template": "http://www.new.com/path/{0}-abc-{1}/",
"regex": "path/abc/(?\\w+)-(?\\d+)",
"params": ["cityname","cityid"]
}

其中比较关键的是regex:"path/abc/(?\w+)-(?\d+)",已知老url满足path以path/abc/开头,后面是{cityname}-{cityid}。其中cityname是任意字母和数字组合但不包含空白符,用\w表示,cityid是数值用\d表示。

2、编码:
private static void group() {
    String url = "http://www.old.com/path/abc/shanghai-123/";
    String reg = "path/abc/(?\\w+)-(?\\d+)";
    Pattern pat = Pattern.compile(reg);
    Matcher mat = pat.matcher(url);
    if (mat.find()) {
        System.out.println(mat.group("cityname"));
        System.out.println(mat.group("cityid"));
    }
}

输出:
shanghai 
123
3、替换新模板:
private static void group() {
    String template = "http://www.new.com/path/{0}-abc-{1}/";
    String[] params = {"cityname", "cityid"};
    String url = "http://www.old.com/path/abc/shanghai-123/";
    String reg = "path/abc/(?\\w+)-(?\\d+)";
    Pattern pat = Pattern.compile(reg);
    Matcher mat = pat.matcher(url);
    if (mat.find()) {
        String[] values = new String[params.length];
        for (int i = 0; i < params.length; i++) {
        values[i] = mat.group(params[i]);
    }
    String result = MessageFormat.format(template, values);
    System.out.println(result);
    }
}

输出:
http://www.new.com/path/shanghai-abc-123/

扩展

1、如果{cityname}本身也包含“-”,可以将regex 改成如下:

String reg = "path/abc/(?[\\w,-]+)-(?\\d+)";

2、如果path有多个满足用“-”拼接的参数,比如url:http://www.old.com/path/abc/shanghai-123/type-1/?p=xxx,这种情况可以将regex 补全,即:

String reg = "path/abc/(?[\\w,-]+)-(?\\d+)/type-1";

3、上述情况,如果“type-1”中的1也是变量,同样可以抓取,如:

String reg = "path/abc/(?[\\w,-]+)-(?\\d+)/type-(?\\d+)";

你可能感兴趣的:(正则表达式从url中抓取特定变量)