Регулярное выражение для определенного формата URL

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

Http:// апи.stackru.com / 1.1/ вопросы /1234/ ответы  
Http:// апи.Physics.stackexchange.com / 1.0/ вопросы /5678/ ответы

куда

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

3 ответа

Решение
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 или более арабским цифрам. Остальное говорит само за себя.

^http://api[.][a-z]+([.]stackexchange)?[.]com/1[.][01]/questions/[0-9]+/answers$

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

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

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

        Pattern p = Pattern.compile(
            "http://api\\.              # Scheme and api subdomain.\n" +
            "(?:                        # Group for domain alternatives.\n" +
            "  stackru            # 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");
        }
    }
}
Другие вопросы по тегам