2012-06-20 3 views
0

и как обычно заблаговременно.Java regEx URL соответствует выпуск

Я пытаюсь ознакомиться с regEx и у меня проблема с URL.

Вот пример URL:

www.examplesite.com/dir/2012/06/19/title-of-some-story/FAQKZjC3veXSalP9zxFgZP/htmlpage.html 

вот что моя Разбивка регулярного выражения выглядит следующим образом:

[site]/[dir]*?/[year]/[month]/[day]/[storyTitle]?/[id]/htmlpage.html 

[id] представляет собой строку из 22 символов в длине, которые могут быть либо прописными или строчными буквами , а также номера. Однако я не хочу извлекать это из URL. Просто уточняю

Теперь мне нужно извлечь два значения из этого URL-адреса.

Во-первых, Мне нужно извлечь каталоги. Тем не менее, [dir] является необязательным, но также может быть как можно больше. Другими словами, этот параметр не может быть там, или он может быть dir1/dir2/dir3 ..etc. Так, поднятие моего первого примера:

www.examplesite.com/dir1/dir2/dir3/2012/06/19/title-of-some-story/FAQKZjC3veXSalP9zxFgZP/htmlpage.html 

Здесь мне нужно извлечь dir1/dir2/dir3 где реж является строкой, которая представляет собой одно слово со всеми строчными буквами (например, спорт/MLB/играми). В каталоге нет номеров, только используя это в качестве примера.

Но в данном примере действительный URL:

www.examplesite.com/2012/06/19/title-of-some-story/FAQKZjC3veXSalP9zxFgZP/htmlpage.html 

Там нет [dir], так что я бы ничего не извлечь. таким образом, [dir] является необязательным

Во-вторых, мне нужно извлечь [storyTitle][storyTitle], где также необязательно так же, как выше [dir], но тем не менее, если есть storyTitle может быть только один.

Так поднятие моих предыдущих примеров

www.examplesite.com/dir/2012/06/19/title-of-some-story/FAQKZjC3veXSalP9zxFgZP/htmlpage.html 

будет действительными, где мне нужно, чтобы извлечь 'title-of-some-story' где название повести тира разделены строки, которые всегда в нижнем регистре. Пример belowis справедливо:

www.examplesite.com/dir/2012/06/19/FAQKZjC3veXSalP9zxFgZP/htmlpage.html 

В приведенном выше примере, нет [storyTitle], таким образом, делая необязательным

Наконец, просто чтобы быть полным, URL-адрес без [dir] и без [storyTitle] также действительны. Пример:

www.examplesite.com/2012/06/19/FAQKZjC3veXSalP9zxFgZP/htmlpage.html 

Допустимый URL. Любой вход был бы полезен, я надеюсь, что я понятен.

+0

имена каталогов не имеют номера. Диск - это единственный мир, который является всеми буквами, а каждая буква - строчной. –

+0

Я отредактировал вопрос. спасибо за вопрос –

+0

Ой, извините, я удалил свой комментарий. Но в интересах не заставлять вас выглядеть сумасшедшим, добавлю, что мой вопрос в том, могут ли каталоги состоять из чисто цифр :) – cklab

ответ

1

Вот один пример, который будет работать.

public static void main(String[] args) { 

    Pattern p = Pattern.compile("(?:http://)?.+?(/.+?)?/\\d+/\\d{2}/\\d{2}(/.+?)?/\\w{22}"); 

    String[] strings ={ 
      "www.examplesite.com/dir1/dir2/4444/2012/06/19/title-of-some-story/FAQKZjC3veXSalP9zxFgZP/htmlpage.html", 
      "www.examplesite.com/2012/06/19/title-of-some-story/FAQKZjC3veXSalP9zxFgZP/htmlpage.html", 
      "www.examplesite.com/dir/2012/06/19/title-of-some-story/FAQKZjC3veXSalP9zxFgZP/htmlpage.html", 
      "www.examplesite.com/dir/2012/06/19/FAQKZjC3veXSalP9zxFgZP/htmlpage.html", 
      "www.examplesite.com/2012/06/19/FAQKZjC3veXSalP9zxFgZP/htmlpage.html" 
    }; 
    for (int idx = 0; idx < strings.length; idx++) { 
     Matcher m = p.matcher(strings[idx]); 
     if (m.find()) { 
      String dir = m.group(1); 
      String title = m.group(2); 
      if (title != null) { 
       title = title.substring(1); // remove the leading/
      } 
      System.out.println(idx+": Dir: "+dir+", Title: "+title); 
     } 
    } 
} 
+0

Спасибо! Это помогает alot –

+0

У меня есть вопрос об одном. Если URL-адрес начинается с «http: //», я получаю неправильные каталоги. Есть предположения? –

+0

В этом случае вам нужно будет указать регулярному выражению, что http: // это возможность. Мы делаем это, добавляя выражение, такое как '(http: //)?'. '?:' будет уведомлять синтаксический анализатор, чтобы не считать выражение как группу. См. Обновленный ответ. – cklab

0

Полное описание доступно на следующих языках: английский.

Edit: Позволяет HTTP: //

Java источник:

import java.util.*; 
import java.lang.*; 
import java.util.regex.*; 

class Main 
{ 
    public static void main (String[] args) throws java.lang.Exception 
    { 
     String url = "http://www.examplesite.com/dir/2012/06/19/title-of-some-story/FAQKZjC3veXSalP9zxFgZP/htmlpage.html"; 
     String url2 = "www.examplesite.com/dir/dir2/dir3/2012/06/19/FAQKZjC3veXSalP9zxFgZP/htmlpage.html"; 
     String url3 = "www.examplesite.com/2012/06/19/title-of-some-story/FAQKZjC3veXSalP9zxFgZP/htmlpage.html"; 

     String patternStr = "(?:http://)?[^/]*[/]?([\\S]*)/[\\d]{4}/[\\d]{2}/[\\d]{2}[/]?([\\S]*)/[\\S]*/[\\S]*"; 

     // Compile regular expression 
     Pattern pattern = Pattern.compile(patternStr); 


     // Match 1st url 
     System.out.println("Match 1st URL:"); 
     Matcher matcher = pattern.matcher(url); 

     if (matcher.find()) { 
      System.out.println("URL: " + matcher.group(0)); 
      System.out.println("DIR: " + matcher.group(1)); 
      System.out.println("TITLE: " + matcher.group(2)); 
     } 
     else{ System.out.println("No match."); } 


     // Match 2nd url 
     System.out.println("\nMatch 2nd URL:"); 
     matcher = pattern.matcher(url2); 

     if (matcher.find()) { 
      System.out.println("URL: " + matcher.group(0)); 
      System.out.println("DIR: " + matcher.group(1)); 
      System.out.println("TITLE: " + matcher.group(2)); 
     } 
     else{ System.out.println("No match."); } 


     // Match 3rd url 
     System.out.println("\nMatch 3rd URL:"); 
     matcher = pattern.matcher(url3); 

     if (matcher.find()) { 
      System.out.println("URL: " + matcher.group(0)); 
      System.out.println("DIR: " + matcher.group(1)); 
      System.out.println("TITLE: " + matcher.group(2)); 
     } 
     else{ System.out.println("No match."); } 
    } 
} 

Выход:

Match 1st URL: 
URL: http://www.examplesite.com/dir/2012/06/19/title-of-some-story/FAQKZjC3veXSalP9zxFgZP/htmlpage.html 
DIR: dir 
TITLE: title-of-some-story 

Match 2nd URL: 
URL: www.examplesite.com/dir/dir2/dir3/2012/06/19/FAQKZjC3veXSalP9zxFgZP/htmlpage.html 
DIR: dir/dir2/dir3 
TITLE: 

Match 3rd URL: 
URL: www.examplesite.com/2012/06/19/title-of-some-story/FAQKZjC3veXSalP9zxFgZP/htmlpage.html 
DIR: 
TITLE: title-of-some-story 
Смежные вопросы