Регулярное выражение для определенного формата 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");
}
}
}