Регулярное выражение для определенного формата URL - PullRequest
0 голосов
/ 03 июля 2011

Я пытаюсь получить выражение регулярного выражения, соответствующее определенному формату URL.В частности, API-адреса для стека обмена.Например, я хочу, чтобы оба из них соответствовали:

http://api.<b>stackoverflow</b>.com/1.<b>1</b>/questions/<b>1234</b>/answers  
http://api.<b>physics.stackexchange</b>.com/1.<b>0</b>/questions/<b>5678</b>/answers

Где

  • все, что не выделено жирным шрифтом, должно совпадать.
  • Первая выделенная жирным шрифтом часть может быть толькосделанный от a до z, и либо один, либо нет полной остановки.
    • Также было бы хорошо, если бы была одна полная остановка, за которой должно следовать слово «stackexchange».Однако это не принципиально.
  • Вторая жирная часть может быть только 1 или 0.
  • Последняя жирная часть может быть только цифрами от 0 до 9,и может быть любой длины
  • До или после URL не может быть вообще ничего, даже косой черты

Ответы [ 3 ]

3 голосов
/ 03 июля 2011
Pattern.compile("^(?i:http://api\\.(?:[a-z]+(?:\\.stackexchange)?)\\.com)/1\\.[01]/questions/[0-9]+/answers\\z")

^ обеспечивает начало в начале ввода, а \\z - в конце ввода.Все точки экранированы, поэтому они буквальны.Часть (?i:...) делает домен и схему нечувствительными к регистру в соответствии со спецификацией URL.[01] соответствует только символам 0 или 1. [0-9]+ соответствует 1 или более арабским цифрам.Остальное говорит само за себя.

1 голос
/ 03 июля 2011
^http://api[.][a-z]+([.]stackexchange)?[.]com/1[.][01]/questions/[0-9]+/answers$

^ соответствует началу строки, $ соответствует концу строки, [.] - это альтернативный способ выхода из точки, отличный от обратного слеша (который сам должен быть экранирован как \\.).

0 голосов
/ 03 июля 2011

Эта протестированная Java-программа имеет закомментированное регулярное выражение, которое должно сработать:

import java.util.regex.*;
public class TEST {
    public static void main(String[] args) {
        String s = "http://api.stackoverflow.com/1.1/questions/1234/answers";

        Pattern p = Pattern.compile(
            "http://api\\.              # Scheme and api subdomain.\n" +
            "(?:                        # Group for domain alternatives.\n" +
            "  stackoverflow            # Either one\n" +
            "| physics\\.stackexchange  # or the other\n" +
            ")                          # End group for domain alternatives.\n" +
            "\\.com                     # TLD\n" +
            "/1\\.[01]                  # Either 1.0 or 1.1\n" +
            "/questions/\\d+/answers    # Rest of path.", 
            Pattern.COMMENTS);
        Matcher m = p.matcher(s);
        if (m.matches()) {
            System.out.print("Match found.\n");
        } else {
            System.out.print("No match found.\n");
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...