Соответствие URL в Java Regex - PullRequest
       0

Соответствие URL в Java Regex

3 голосов
/ 06 января 2012

У меня есть простое регулярное выражение, которое соответствует некоторому URL, и оно отлично работает, однако я хотел бы немного его уточнить, чтобы исключить URL, содержащий определенное слово.

Моя скороговорка: (http:[A-z0-9./~%]+)

IE:

http://maps.google.com/maps
http://www.google.com/flights/gwsredirect
http://slav0nic.org.ua/static/books/python/
http://webcache.googleusercontent.com/search
http://www.python.org/ftp/python/doc/
http://webcache.googleusercontent.com/search
http://www.python.org/ftp/python/

Приведите приведенный выше список URL, соответствующий моему шаблону. Я бы хотел уточнить свой шаблон, чтобы исключить URL, содержащий слово, например google

Я пытался использовать группы без захвата, но безуспешно, может быть, я что-то упустил.

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ

Может быть, мое описание не было ясным.

Хорошо, у меня есть файл данных, извлеченный из URL, затем я использую шаблон, который я предоставил, для извлечения списка предоставленных ссылок, но, как вы можете видеть, шаблон возвращает все ссылки, он делает больше, чем я хочу, чтобы он делал , Поэтому я хочу уточнить, чтобы не давать мне ссылки, содержащие определенное слово, например: google

Таким образом, после того, как я проанализирую данные вместо того, чтобы возвращать список ссылок выше, он вместо этого вернет следующее:

http://slav0nic.org.ua/static/books/python/
http://www.python.org/ftp/python/doc/
http://www.python.org/ftp/python/

enter image description here

Спасибо за помощь, спасибо!

Ответы [ 3 ]

2 голосов
/ 06 января 2012

Попробуйте это:

(http:(?![^"\s]*google)[^"\s]+)["\s]

Ключевым отличием от ранее опубликованных решений является то, что я контролирую длину поиска для поиска.

1 голос
/ 06 января 2012

Попробуйте:

(http:(?!.*google).*)

Источник: похожие вопросы

РЕДАКТИРОВАТЬ: (это работает, проверено)

public static void main( String[] args ) {

    final Pattern p = Pattern.compile( "(http:(?!.*google).*)" );
    final String[] in = new String[]{
        "http://maps.google.com/maps",
        "http://www.google.com/flights/gwsredirect",
        "http://slav0nic.org.ua/static/books/python/",
        "http://webcache.googleusercontent.com/search",
        "http://www.python.org/ftp/python/doc/",
        "http://webcache.googleusercontent.com/search",
        "http://www.python.org/ftp/python/",
    };

    for ( final String s : in ) {    
      final Matcher m = p.matcher( s );
      System.out.print( s );
      if ( m.find() ) {
        System.out.println( " true" );
      } else {
        System.out.println( " false" );
      }
    }
}

ВЫХОД:

http://maps.google.com/maps false
http://www.google.com/flights/gwsredirect false
http://slav0nic.org.ua/static/books/python/ true
http://webcache.googleusercontent.com/search false
http://www.python.org/ftp/python/doc/ true
http://webcache.googleusercontent.com/search false
http://www.python.org/ftp/python/ true
0 голосов
/ 06 января 2012

Измените свое регулярное выражение для захвата имени хоста и используйте .contains():

public final class TestMatch
{
    private static final List<String> urls = Arrays.asList(
        "http://maps.google.com/maps",
        "http://www.google.com/flights/gwsredirect",
        "http://slav0nic.org.ua/static/books/python/",
        "http://webcache.googleusercontent.com/search",
        "http://www.python.org/ftp/python/doc/",
        "http://webcache.googleusercontent.com/search",
        "http://www.python.org/ftp/python/"
    );

    private static final Pattern p
        = Pattern.compile("^http://([^/]+)/");

    private static final int TRIES = 50000;

    public static void main(final String... args)
    {
        for (final String url: urls)
            System.out.printf("%s: %b\n", url, regexIsOK(url));

        long start, end;

        start = System.currentTimeMillis();
        for (int i = 0; i < TRIES; i++)
            for (final String url: urls)
                regexIsOK(url);
        end = System.currentTimeMillis();

        System.out.println("Time taken: " + (end - start) + " ms");
        System.exit(0);
    }

    private static boolean regexIsOK(final String url)
    {
        final Matcher m = p.matcher(url);

        return m.find() && !m.group(1).contains("google");
    }
}

Пример вывода:

http://maps.google.com/maps: false
http://www.google.com/flights/gwsredirect: false
http://slav0nic.org.ua/static/books/python/: true
http://webcache.googleusercontent.com/search: false
http://www.python.org/ftp/python/doc/: true
http://webcache.googleusercontent.com/search: false
http://www.python.org/ftp/python/: true
Time taken: 258 ms
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...