Генерация шаблона URL, когда предоставляется набор из 5 или около того URL - PullRequest

Ответы [ 2 ]

3 голосов
/ 02 марта 2010

Вы можете попробовать этот инструмент txt2re Хороший онлайн-инструмент, в котором вы вводите пример строки и генерируете регулярное выражение, соответствующее вам.

txt2re описывает себя как:

облегчение головной боли для программистов :: генератор регулярных выражений

3 голосов
/ 02 марта 2010

Наивным подходом было бы разделить ваш URL-адрес на группы (скажем, url.split("/")) и сравнить полученные массивы. Если части совпадают, просто добавьте их как постоянные строки в шаблон. Если нет, добавьте шаблон, который соответствует всем возможным значениям. Вот простая реализация:

public static void main(String[] args) throws Exception {
    String[] urls = {
            "http://www.buy.com/prod/disney-s-star-struck/q/loc/109/213724402.html", 
            "http://www.buy.com/prod/samsung-f2380-23-widescreen-1080p-lcd-monitor-150-000-1-dc-8ms-1920-x/q/loc/101/211249863.html",
            "http://www.buy.com/prod/panasonic-nnh765wf-microwave-oven-countertop-1-6-ft-1250w-panasonic/q/loc/66357/202045865.html",
            "http://www.buy.com/prod/escape-by-calvin-klein-for-women-3-4-oz-edp-spray/q/loc/66740/211210860.html",
            "http://www.buy.com/prod/v-touch-8gb-mp3-mp4-2-8-touch-screen-2mp-camera-expandable-minisd-w/q/loc/111/211402014.html"
    };

    String all = "[^/]+";
    String[] pattern = urls[0].split("/");
    for (int i = 0; i < urls.length; i++) {
        String parts[] = urls[i].split("/");

        // TODO handle urls with different number of parts
        for (int j = 0; j < pattern.length; j++) {
            // intentionally match by reference
            if (pattern[j] != all && !pattern[j].equals(parts[j])) {
                pattern[j] = all;
            }
        }
    }

    // build pattern - use [^/]+ as a replacement (anything but a '/')
    StringBuilder buf = new StringBuilder();
    for (int i = 0; i < pattern.length; i++) {
        buf.append(pattern[i] == all ? all : Pattern.quote(pattern[i]));
        buf.append("/");
    }
    // stip last "/"
    buf.setLength(buf.length() - 1);

    // compile pattern
    Pattern p = Pattern.compile(buf.toString());

    // output
    System.out.println(p.pattern());
    for (int i = 0; i < urls.length; i++) {
        System.out.println(p.matcher(urls[i]).matches());
    }

}

Вот вывод этого примера:

\Qhttp:\E/\Q\E/\Qwww.buy.com\E/\Qprod\E/[^/]+/\Qq\E/\Qloc\E/[^/]+/[^/]+
true
true
true
true
true

Как видите, шаблон выглядит немного странно. Это из-за цитирования Pattern. Тем не менее, шаблон соответствует всем URL из этого примера. Тем не менее, осталось проделать определенную работу, особенно заметную обработку URL-адресов с различным количеством частей после разделения и общих суффиксов (.html).

...