Регулярное выражение Hostname - PullRequest
1 голос
/ 15 марта 2012

Я занимаюсь разработкой робота http, и я разработал это регулярное выражение (((?:f|ht)tp(?:s)?\\://)?|www)([^/]+) для обнаружения и извлечения имени хоста из ссылки (href). Теперь я выложил здесь результаты тестов:

String -> http://www.meloteca.com/empresas-editoras.htm   
Returns   http://www.meloteca.com
String -> www.meloteca.com/empresas-editoras.htm    
Returns   www.meloteca.com
String -> /empresas-editoras.htm   
Returns   empresas-editoras.htm (without the slash)

В этом случае я ожидал, что регулярные выражения не возвращают никакого значения? Почему это происходит? То же самое, если я попробую со следующей строкой

String -> empresas-editoras.htm   
Returns   empresas-editoras.htm

Фрагмент кода:

Pattern padrao = Pattern.compile("(((?:f|ht)tp(?:s)?\\://)?|www)([^/]+)");
        Matcher mat = padrao.matcher("empresas-editoras.htm");
        if(mat.find())
            System.out.println("Host->"+mat.group());

Ответы [ 3 ]

3 голосов
/ 15 марта 2012

Лучше использовать класс URI и его методы, такие как getHost() и getPath(), а не регулярное выражение. Правила построения URI более сложны, чем вы, вероятно, предполагаете, и у вашего регулярного выражения, вероятно, будет много угловых случаев, которые не будут обработаны правильно.

1 голос
/ 15 марта 2012

Если вы удалите один из вопросительных знаков, например:

(((?:f|ht)tp(?:s)?\\://)|www)([^/]+)

, он должен работать лучше.

0 голосов
/ 15 марта 2012

Альтернатива ((?:f|ht)tp(?:s)?\\://)? является необязательной, поэтому она может быть пустой строкой, и тогда ([^/]+) будет соответствовать любой строке, не содержащей /.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...