Java 에서 문자열이 URL 형식에 맞는지 확인하는 방법

JavaBeginner
지금 연습하기

소개

이 랩에서는 정규 표현식을 사용하여 Java 에서 주어진 문자열이 URL 형식과 일치하는지 확인하는 방법을 배우게 됩니다. URL 을 위해 특별히 설계된 정규 표현식 패턴을 정의하고, 이 패턴에 대해 문자열을 테스트하기 위해 Pattern.matches() 메서드를 활용하며, 일반적인 URL 스킴 (scheme) 의 유효성을 검사하는 방법을 살펴볼 것입니다. 이 실습을 통해 Java 애플리케이션에서 URL 유효성 검사를 구현하는 실질적인 단계를 안내해 드리겠습니다.

URL 정규 표현식 패턴 정의

이 단계에서는 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;: 이 줄은 정규 표현식에 대한 Java 의 내장 지원의 일부인 Pattern 클래스를 가져옵니다.
    • String urlRegex = "^(http|https)://[^\\s/$.?#].[^\\s]*$";: 이 줄은 urlRegex라는 String 변수를 정의하고 정규 표현식 패턴을 할당합니다.
      • ^: 문자열의 시작 부분과 일치합니다.
      • (http|https): "http" 또는 "https" 중 하나와 일치합니다.
      • ://: 리터럴 문자 "://"와 일치합니다.
      • [^\\s/$.?#]: 공백 문자 (\\s), 슬래시 (/), 달러 기호 ($), 마침표 (.), 물음표 (?), 또는 해시 기호 (#) 가 아닌 모든 문자와 일치합니다. 이것은 도메인 이름 부분을 일치시키는 단순화된 방법입니다.
      • .: 모든 문자 (줄 바꿈 제외) 와 일치합니다.
      • [^\\s]*: 공백이 아닌 문자가 0 개 이상 일치합니다. 이것은 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

    오류가 없으면 명령이 출력 없이 완료됩니다. UrlValidator.class 파일이 ~/project 디렉토리에 생성됩니다.

  9. java 명령을 사용하여 컴파일된 프로그램을 실행합니다.

    java UrlValidator

    다음 출력을 볼 수 있습니다.

    URL Regex Pattern Defined.

URL 에 대한 기본 정규 표현식 패턴을 포함하는 Java 프로그램을 성공적으로 정의하고 컴파일했습니다. 다음 단계에서는 이 패턴을 사용하여 다양한 문자열이 유효한 URL 인지 테스트합니다.

Pattern.matches() 로 URL 테스트

이전 단계에서는 URL 에 대한 정규 표현식 패턴을 정의하고 이를 Pattern 객체로 컴파일했습니다. 이제 Pattern.matches() 메서드를 사용하여 다양한 문자열이 유효한 URL 인지 확인해 보겠습니다.

Pattern.matches(regex, input) 메서드는 전체 입력 문자열이 주어진 정규 표현식과 일치하는지 확인하는 편리한 방법입니다. 정규 표현식을 컴파일하고 한 단계로 입력과 일치시킵니다.

몇 가지 예제 URL 을 테스트하기 위해 UrlValidator.java 파일을 수정해 보겠습니다.

  1. WebIDE 편집기에서 UrlValidator.java 파일이 아직 열려 있지 않은 경우 엽니다.

  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);
        }
    }

    다음은 추가한 내용입니다.

    • 몇 가지 유효한 URL 과 유효하지 않은 URL 을 포함하는 서로 다른 예제 문자열을 포함하는 네 개의 String 변수 (url1, url2, url3, url4) 를 정의했습니다.
    • 출력을 더 명확하게 하기 위해 print 문을 추가했습니다.
    • 각 테스트 문자열에 대해 Pattern.matches(urlRegex, url)을 사용했습니다. 이 메서드는 전체 문자열이 urlRegex 패턴과 일치하면 true를 반환하고, 그렇지 않으면 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 로, 마지막 두 문자열을 유효하지 않은 URL 로 올바르게 식별했음을 보여줍니다.

이제 Java 에서 Pattern.matches() 메서드를 사용하여 정규 표현식 패턴에 대해 문자열을 성공적으로 테스트했습니다.

일반적인 URL 스키마 유효성 검사

이전 단계에서는 간단한 정규 표현식 패턴을 정의하고 Pattern.matches()를 사용하여 테스트했습니다. 현재 패턴은 http 또는 https로 시작하는 URL 만 유효성을 검사합니다. 그러나 URL 에는 ftp, mailto, file 등과 같은 다른 스키마가 있을 수 있습니다.

이 단계에서는 정규 표현식 패턴을 수정하여 더 일반적인 URL 스키마를 포함합니다. URL 에 대한 더 강력한 정규 표현식 패턴은 매우 복잡하지만, 데모 목적으로 현재 패턴을 확장하여 몇 가지 더 일반적인 스키마를 포함할 수 있습니다.

UrlValidator.java 파일을 업데이트해 보겠습니다.

  1. WebIDE 편집기에서 UrlValidator.java 파일을 엽니다.

  2. urlRegex 문자열을 수정하여 httphttps 외에 ftpmailto 스키마를 포함합니다. 또한 ftp URL 에 대한 테스트 케이스도 추가합니다.

    다음 줄을 바꿉니다.

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

    다음으로:

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

    그룹을 나타내는 괄호 () 안에 |ftp|mailto를 추가했으며, | 기호는 "OR" 연산자 역할을 합니다. 즉, 이제 패턴은 http, https, ftp 또는 mailto로 시작하고 그 뒤에 ://가 오는 문자열과 일치합니다.

  3. FTP URL 에 대한 새 테스트 케이스를 추가합니다. url4의 정의 뒤에 다음 줄을 추가합니다.

    String url5 = "ftp://ftp.example.com/files"; // Valid FTP URL
  4. url4에 대한 유효성 검사 후 url5에 대한 유효성 검사를 추가합니다.

    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

    이제 FTP URL 도 유효한 것으로 표시되어 다음과 유사한 출력을 볼 수 있습니다.

    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 스키마를 포함하도록 정규 표현식 패턴을 성공적으로 수정하고 업데이트된 패턴을 테스트했습니다. 이는 더 광범위한 입력을 일치시키도록 정규 표현식 패턴을 조정할 수 있는 방법을 보여줍니다.

요약

이 Lab 에서는 URL 유효성 검사를 위해 Java 에서 정규 표현식 패턴을 정의하는 방법을 배우는 것으로 시작했습니다. UrlValidator.java라는 새 Java 파일을 생성하고 java.util.regex.Pattern 클래스를 가져왔습니다. 그런 다음 "http" 또는 "https"로 시작하고 그 뒤에 "://"가 오는 문자열과 일치하도록 설계된 기본 정규 표현식 패턴을 포함하는 String 변수 urlRegex를 정의하고, Pattern.compile()을 사용하여 이 패턴을 컴파일했습니다. 이 초기 단계는 Java 의 내장 정규 표현식 기능을 사용하여 URL 유효성 검사를 위한 필수 도구를 설정하고 핵심 패턴을 정의하는 데 중점을 두었습니다.