Как проверить, соответствует ли строка формату URL в Java

JavaJavaBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом практическом занятии (лабораторной работе) вы научитесь проверять, соответствует ли заданная строка формату URL на Java с использованием регулярных выражений. Мы определим шаблон регулярного выражения, специально разработанный для URL, воспользуемся методом Pattern.matches() для проверки строк на соответствие этому шаблону и рассмотрим, как проверить правильность общих схем URL. Это практическое упражнение приведет вас по шагам к реализации проверки URL в ваших Java-приложениях.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/StringManipulationGroup(["String Manipulation"]) java/StringManipulationGroup -.-> java/regex("RegEx") subgraph Lab Skills java/regex -.-> lab-559993{{"Как проверить, соответствует ли строка формату URL в Java"}} end

Определение регулярного выражения для URL

На этом этапе мы научимся определять регулярное выражение (regex) в Java для сопоставления с URL. Регулярные выражения, часто сокращенные до "regex" или "regexp", представляют собой последовательности символов, которые определяют шаблон поиска. Они чрезвычайно мощны для сопоставления шаблонов и манипуляции строками.

Для проверки правильности URL регулярное выражение помогает нам проверить, соответствует ли заданная строка стандартной структуре URL (например, http://www.example.com или https://example.org/path).

Создадим новый Java-файл для работы с регулярными выражениями.

  1. Откройте WebIDE. В проводнике файлов слева убедитесь, что вы находитесь в директории ~/project.

  2. Щелкните правой кнопкой мыши в пустом пространстве директории ~/project и выберите "New File".

  3. Назовите новый файл UrlValidator.java и нажмите Enter.

  4. Файл UrlValidator.java должен открыться в редакторе кода.

  5. Скопируйте и вставьте следующий Java-код в редактор:

    import java.util.regex.Pattern;
    
    public class UrlValidator {
    
        public static void main(String[] args) {
            // Define a simple regex pattern for a URL
            String urlRegex = "^(http|https)://[^\\s/$.?#].[^\\s]*$";
    
            // Compile the regex pattern
            Pattern pattern = Pattern.compile(urlRegex);
    
            System.out.println("URL Regex Pattern Defined.");
        }
    }

    Разберем новые части этого кода:

    • import java.util.regex.Pattern;: Эта строка импортирует класс Pattern, который является частью встроенной поддержки регулярных выражений в Java.
    • String urlRegex = "^(http|https)://[^\\s/$.?#].[^\\s]*$";: Эта строка определяет переменную типа String с именем urlRegex и присваивает ей наше регулярное выражение.
      • ^: Соответствует началу строки.
      • (http|https): Соответствует либо "http", либо "https".
      • ://: Соответствует литеральным символам "://".
      • [^\\s/$.?#]: Соответствует любому символу, который НЕ является пробельным символом (\\s), косой чертой (/), знаком доллара ($), точкой (.), вопросительным знаком (?) или хэш-символом (#). Это упрощенный способ сопоставить часть доменного имени.
      • .: Соответствует любому символу (кроме перевода строки).
      • [^\\s]*: Соответствует нулю или более символам, которые НЕ являются пробельными. Это упрощенный способ сопоставить остальную часть пути URL и запроса.
      • $: Соответствует концу строки.
      • Обратите внимание на двойные обратные слэши (\\) перед s. В строках Java одинарный обратный слэш является символом экранирования, поэтому нам нужно использовать \\ для представления литерального обратного слэша в регулярном выражении.
    • Pattern pattern = Pattern.compile(urlRegex);: Эта строка компилирует строку регулярного выражения в объект Pattern. Компиляция шаблона более эффективна, если вы планируете использовать один и тот же шаблон несколько раз.
    • System.out.println("URL Regex Pattern Defined.");: Эта строка просто выводит сообщение в консоль, указывающее, что шаблон был определен.
  6. Сохраните файл (Ctrl+S или Cmd+S).

  7. Теперь скомпилируем эту Java-программу. Откройте терминал внизу WebIDE. Убедитесь, что вы находитесь в директории ~/project.

  8. Скомпилируйте код с помощью команды javac:

    javac UrlValidator.java

    Если нет ошибок, команда завершится без вывода. В директории ~/project будет создан файл UrlValidator.class.

  9. Запустите скомпилированную программу с помощью команды java:

    java UrlValidator

    Вы должны увидеть следующий вывод:

    URL Regex Pattern Defined.

Вы успешно определили и скомпилировали Java-программу, которая включает в себя базовое регулярное выражение для URL. На следующем этапе мы будем использовать этот шаблон для проверки, являются ли различные строки допустимыми URL.

Проверка URL с использованием метода Pattern.matches()

На предыдущем этапе мы определили регулярное выражение для URL и скомпилировали его в объект Pattern. Теперь давайте используем этот шаблон для проверки, являются ли различные строки допустимыми URL с помощью метода Pattern.matches().

Метод Pattern.matches(regex, input) представляет собой удобный способ проверить, соответствует ли вся входная строка заданному регулярному выражению. Он компилирует регулярное выражение и проверяет входную строку на соответствие ему за один шаг.

Давайте изменим наш файл UrlValidator.java для проверки некоторых примеров URL.

  1. Откройте файл UrlValidator.java в редакторе WebIDE, если он еще не открыт.

  2. Измените метод main, добавив следующий код. Этот код нужно добавить после строки Pattern pattern = Pattern.compile(urlRegex);.

    import java.util.regex.Pattern;
    
    public class UrlValidator {
    
        public static void main(String[] args) {
            // Define a simple regex pattern for a URL
            String urlRegex = "^(http|https)://[^\\s/$.?#].[^\\s]*$";
    
            // Compile the regex pattern
            Pattern pattern = Pattern.compile(urlRegex);
    
            // Test some URLs
            String url1 = "http://www.example.com";
            String url2 = "https://example.org/path/to/page";
            String url3 = "ftp://invalid-url.com"; // Invalid scheme
            String url4 = "http:// example.com"; // Invalid character (space)
    
            System.out.println("\nTesting URLs:");
    
            boolean isUrl1Valid = Pattern.matches(urlRegex, url1);
            System.out.println(url1 + " is valid: " + isUrl1Valid);
    
            boolean isUrl2Valid = Pattern.matches(urlRegex, url2);
            System.out.println(url2 + " is valid: " + isUrl2Valid);
    
            boolean isUrl3Valid = Pattern.matches(urlRegex, url3);
            System.out.println(url3 + " is valid: " + isUrl3Valid);
    
            boolean isUrl4Valid = Pattern.matches(urlRegex, url4);
            System.out.println(url4 + " is valid: " + isUrl4Valid);
        }
    }

    Вот что мы добавили:

    • Мы определили четыре переменные типа String (url1, url2, url3, url4), содержащие различные примеры строк, некоторые из которых являются допустимыми URL по нашему простому шаблону, а некоторые - недопустимыми.
    • Мы добавили инструкцию вывода для более ясного отображения результата.
    • Мы использовали метод Pattern.matches(urlRegex, url) для каждой тестовой строки. Этот метод возвращает true, если вся строка соответствует шаблону urlRegex, и false в противном случае.
    • Мы вывели результат проверки для каждого URL.
  3. Сохраните файл UrlValidator.java.

  4. Скомпилируйте измененный код в терминале:

    javac UrlValidator.java

    Опять же, если компиляция прошла успешно, никакого вывода не будет.

  5. Запустите скомпилированную программу:

    java UrlValidator

    Вы должны увидеть вывод, похожий на следующий:

    URL Regex Pattern Defined.
    
    Testing URLs:
    http://www.example.com is valid: true
    https://example.org/path/to/page is valid: true
    ftp://invalid-url.com is valid: false
    http:// example.com is valid: false

Этот вывод показывает, что наше простое регулярное выражение правильно определило первые две строки как допустимые URL (согласно шаблону), а последние две - как недопустимые.

Теперь вы успешно использовали метод Pattern.matches() для проверки строк на соответствие регулярному выражению в Java.

Валидация общих схем URL

На предыдущих этапах мы определили простое регулярное выражение и использовали метод Pattern.matches() для его проверки. Наш текущий шаблон валидирует только URL, начинающиеся с http или https. Однако URL могут иметь другие схемы, такие как ftp, mailto, file и т.д.

На этом этапе мы изменим наше регулярное выражение, чтобы оно включало в себя больше общих схем URL. Более надежный шаблон регулярного выражения для URL довольно сложен, но мы можем расширить наш текущий шаблон, добавив несколько более общих схем для демонстрации.

Давайте обновим файл UrlValidator.java.

  1. Откройте файл UrlValidator.java в редакторе WebIDE.

  2. Измените строку urlRegex, чтобы она включала схемы ftp и mailto помимо http и https. Также добавим тестовый случай для URL с схемой ftp.

    Замените строку:

    String urlRegex = "^(http|https)://[^\\s/$.?#].[^\\s]*$";

    на:

    String urlRegex = "^(http|https|ftp|mailto)://[^\\s/$.?#].[^\\s]*$";

    Обратите внимание, что мы просто добавили |ftp|mailto внутри скобок (), которые представляют группу, а символ | действует как оператор "ИЛИ". Это означает, что шаблон теперь будет соответствовать строкам, начинающимся с http, https, ftp или mailto, за которыми следует ://.

  3. Добавьте новый тестовый случай для URL с схемой FTP. Добавьте следующие строки после определения url4:

    String url5 = "ftp://ftp.example.com/files"; // Valid FTP URL
  4. Добавьте валидацию для url5 после валидации для url4:

    boolean isUrl5Valid = Pattern.matches(urlRegex, url5);
    System.out.println(url5 + " is valid: " + isUrl5Valid);

    Теперь ваш полный метод main должен выглядеть следующим образом:

    import java.util.regex.Pattern;
    
    public class UrlValidator {
    
        public static void main(String[] args) {
            // Define a simple regex pattern for a URL including more schemes
            String urlRegex = "^(http|https|ftp|mailto)://[^\\s/$.?#].[^\\s]*$";
    
            // Compile the regex pattern
            Pattern pattern = Pattern.compile(urlRegex);
    
            System.out.println("URL Regex Pattern Defined.");
    
            // Test some URLs
            String url1 = "http://www.example.com";
            String url2 = "https://example.org/path/to/page";
            String url3 = "invalid-url.com"; // Invalid (missing scheme)
            String url4 = "http:// example.com"; // Invalid character (space)
            String url5 = "ftp://ftp.example.com/files"; // Valid FTP URL
    
            System.out.println("\nTesting URLs:");
    
            boolean isUrl1Valid = Pattern.matches(urlRegex, url1);
            System.out.println(url1 + " is valid: " + isUrl1Valid);
    
            boolean isUrl2Valid = Pattern.matches(urlRegex, url2);
            System.out.println(url2 + " is valid: " + isUrl2Valid);
    
            boolean isUrl3Valid = Pattern.matches(urlRegex, url3);
            System.out.println(url3 + " is valid: " + isUrl3Valid);
    
            boolean isUrl4Valid = Pattern.matches(urlRegex, url4);
            System.out.println(url4 + " is valid: " + isUrl4Valid);
    
            boolean isUrl5Valid = Pattern.matches(urlRegex, url5);
            System.out.println(url5 + " is valid: " + isUrl5Valid);
        }
    }
  5. Сохраните файл UrlValidator.java.

  6. Скомпилируйте обновленный код в терминале:

    javac UrlValidator.java
  7. Запустите скомпилированную программу:

    java UrlValidator

    Теперь вы должны увидеть вывод, похожий на следующий, при этом URL с схемой FTP также будет помечен как допустимый:

    URL Regex Pattern Defined.
    
    Testing URLs:
    http://www.example.com is valid: true
    https://example.org/path/to/page is valid: true
    invalid-url.com is valid: false
    http:// example.com is valid: false
    ftp://ftp.example.com/files is valid: true

Вы успешно изменили регулярное выражение, чтобы оно включало больше общих схем URL, и проверили обновленный шаблон. Это демонстрирует, как можно настраивать регулярные выражения для соответствия более широкому диапазону входных данных.

Резюме

В этом практическом занятии мы начали с изучения того, как определить регулярное выражение в Java для валидации URL. Мы создали новый Java-файл UrlValidator.java и импортировали класс java.util.regex.Pattern. Затем мы определили переменную типа String с именем urlRegex, содержащую базовое регулярное выражение, предназначенное для сопоставления строк, начинающихся с "http" или "https", за которыми следует "://", и скомпилировали этот шаблон с помощью метода Pattern.compile(). Этот первый этап был посвящен настройке необходимых инструментов и определению основного шаблона для валидации URL с использованием встроенных возможностей регулярных выражений в Java.