소개
이 랩에서는 정규 표현식 (Regex) 을 사용하여 Java 에서 문자열이 전화번호 형식과 일치하는지 확인하는 방법을 배우게 됩니다. 먼저 일반적인 전화번호 형식과 일치하도록 특별히 설계된 Regex 패턴을 생성하는 것으로 시작합니다.
그 다음, Java 의 Matcher 클래스를 사용하여 생성된 Regex 패턴에 대해 주어진 전화번호 문자열의 유효성을 검사합니다. 마지막으로, Regex 패턴을 조정하여 다양한 전화번호 형식 변형을 처리하고 일치시키는 방법을 살펴봅니다.
전화번호 Regex 생성
이 단계에서는 정규 표현식 (Regex) 에 대해 배우고 전화번호와 일치하는 Regex 를 만드는 방법을 배웁니다. Regex 는 문자열에서 패턴 매칭에 사용되는 강력한 도구입니다. 텍스트 패턴을 설명하기 위한 특별한 언어와 같습니다.
전화번호에 Regex 가 필요한 이유는 무엇일까요? 전화번호는 다양한 형식으로 제공될 수 있습니다 (예: 123-456-7890, (123) 456-7890, 123.456.7890). Regex 를 사용하면 이러한 모든 변형과 일치하는 패턴을 정의할 수 있습니다.
문자열이 전화번호처럼 보이는지 확인하기 위해 Regex 를 사용하는 간단한 Java 프로그램을 만들어 보겠습니다.
WebIDE 편집기에서
HelloJava.java파일을 엽니다 (아직 열려 있지 않은 경우).파일의 전체 내용을 다음 코드로 바꿉니다.
import java.util.regex.Matcher; import java.util.regex.Pattern; public class HelloJava { public static void main(String[] args) { String phoneNumber = "123-456-7890"; // The string to check String regex = "\\d{3}-\\d{3}-\\d{4}"; // The regex pattern Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(phoneNumber); boolean isMatch = matcher.matches(); if (isMatch) { System.out.println(phoneNumber + " is a valid phone number format."); } else { System.out.println(phoneNumber + " is not a valid phone number format."); } } }이 코드의 새로운 부분을 살펴보겠습니다.
import java.util.regex.Matcher;및import java.util.regex.Pattern;: 이 줄은 Java 에서 Regex 를 사용하기 위한 필요한 클래스를 가져옵니다.String phoneNumber = "123-456-7890";: 이것은 우리가 테스트하려는 문자열입니다.String regex = "\\d{3}-\\d{3}-\\d{4}";: 이것은 우리의 첫 번째 Regex 패턴입니다. 자세히 살펴보겠습니다.\\d: 모든 숫자 (0-9) 와 일치합니다.\\을 사용하는데,\는 Java 문자열에서 특수 문자이므로 이스케이프해야 합니다.{3}: 이전 요소를 정확히 3 번 일치시킵니다.-: 하이픈 문자를 그대로 일치시킵니다.- 따라서
\\d{3}-\\d{3}-\\d{4}는 세 자리 숫자, 하이픈, 세 자리 숫자, 하이픈, 네 자리 숫자와 일치합니다.
Pattern pattern = Pattern.compile(regex);: 이것은 Regex 문자열을Pattern객체로 컴파일합니다. 이는 반복적인 매칭에 더 효율적입니다.Matcher matcher = pattern.matcher(phoneNumber);: 이것은 컴파일된pattern을 사용하여phoneNumber문자열에 대해 매칭 작업을 수행할Matcher객체를 생성합니다.boolean isMatch = matcher.matches();: 이것은 전체 입력 문자열 (phoneNumber) 을 패턴과 일치시키려고 시도합니다. 전체 문자열이 일치하면true를 반환하고, 그렇지 않으면false를 반환합니다.if및else블록은 문자열이 패턴과 일치하는지 여부에 따라 메시지를 출력합니다.
파일을 저장합니다 (Ctrl+S 또는 Cmd+S).
터미널에서 프로그램을 컴파일합니다.
javac HelloJava.java오류가 없으면
HelloJava.class파일이 생성됩니다.컴파일된 프로그램을 실행합니다.
java HelloJava"123-456-7890"이 우리의 간단한 Regex 에 따라 유효한 전화번호 형식임을 나타내는 출력을 볼 수 있습니다.
이 단계에서는 Java 에서 Regex 를 사용하는 기본 사항을 배우고 특정 전화번호 형식과 일치하는 간단한 패턴을 만들었습니다. 다음 단계에서는 다양한 형식을 처리할 수 있도록 Regex 를 더 유연하게 만들 것입니다.
Matcher 를 이용한 전화번호 유효성 검사
이전 단계에서는 간단한 Regex 패턴을 만들고 Matcher 클래스의 matches() 메서드를 사용하여 전체 문자열이 패턴과 일치하는지 확인했습니다. 이 단계에서는 Matcher 클래스를 더 자세히 살펴보고 작동 방식을 살펴보겠습니다.
Matcher 클래스는 매칭 작업을 수행하는 엔진입니다. Pattern 객체에서 생성되며 입력 문자열 내에서 패턴의 발생을 찾는 데 사용됩니다.
다른 문자열을 테스트하고 matches() 메서드가 어떻게 동작하는지 확인하기 위해 프로그램을 수정해 보겠습니다.
WebIDE 편집기에서
HelloJava.java파일을 엽니다.phoneNumber문자열을 현재 패턴\\d{3}-\\d{3}-\\d{4}와 정확히 일치하지 않는 것으로 변경합니다. 예를 들어, 다음 줄을 변경합니다.String phoneNumber = "123-456-7890"; // The string to check다음으로 변경합니다.
String phoneNumber = "My phone number is 123-456-7890."; // The string to check파일을 저장합니다 (Ctrl+S 또는 Cmd+S).
터미널에서 수정된 프로그램을 컴파일합니다.
javac HelloJava.java컴파일된 프로그램을 실행합니다.
java HelloJava이번에는 다음과 같은 출력이 표시됩니다.
My phone number is 123-456-7890. is not a valid phone number format.이런 일이 왜 발생했을까요?
matches()메서드는 전체 입력 문자열을 패턴과 일치시키려고 시도하기 때문입니다. 입력 문자열에는 전화번호 패턴 외에 다른 내용도 포함되어 있으므로matches()는false를 반환합니다.패턴이 문자열 어딘가에 존재하는지 찾고 싶다면, 나중에 살펴볼
find()와 같은 다른 메서드를 사용합니다. 현재는matches()를 사용하여 전체 문자열이 특정 형식에 부합하는지 유효성을 검사하는 데 집중하고 있습니다.Java 에서 Regex 를 사용할 때는
matches()와find()의 차이점을 이해하는 것이 중요합니다.matches()는 전체 문자열의 엄격한 유효성 검사를 위한 것이고,find()는 더 큰 문자열 내에서 패턴을 검색하기 위한 것입니다.
이 단계에서는 Matcher 클래스의 matches() 메서드가 어떻게 작동하는지, 그리고 문자열 형식을 유효성 검사할 때 해당 동작을 이해하는 것이 왜 중요한지 확인했습니다.
다양한 전화번호 형식 처리
실제 세계에서 전화번호는 항상 정확한 XXX-XXX-XXXX 형식을 따르지 않습니다. 마침표 (.), 공백 (``), 또는 괄호 (()) 를 사용할 수 있습니다. 이 단계에서는 이러한 변형 중 일부를 처리하도록 Regex 패턴을 수정합니다.
패턴을 더 유연하게 만들기 위해 몇 가지 더 많은 Regex 개념을 소개합니다.
?: 이전 요소를 선택 사항으로 만듭니다 (0 또는 1 회).*: 이전 요소를 0 회 이상 일치시킵니다.+: 이전 요소를 1 회 이상 일치시킵니다.[]: 문자 집합을 정의합니다. 대괄호 안의 모든 단일 문자와 일치합니다.|: OR 연산자 역할을 합니다.|앞 또는 뒤의 패턴 중 하나와 일치합니다.
HelloJava.java 파일을 업데이트하여 더 유연한 Regex 패턴을 사용해 보겠습니다.
WebIDE 편집기에서
HelloJava.java파일을 엽니다.regex문자열을 다음으로 변경합니다.String regex = "\\(?\\d{3}\\)?[-.\\s]?\\d{3}[-.\\s]?\\d{4}"; // More flexible regex pattern이 새로운 패턴을 자세히 살펴보겠습니다.
\\(?: 선택적 여는 괄호(와 일치합니다. Regex 에서(의 특수한 의미를 이스케이프하기 위해\\이 필요하며,?는 이를 선택 사항으로 만듭니다.\\d{3}: 정확히 세 자리 숫자와 일치합니다.\\)?: 선택적 닫는 괄호)와 일치합니다.[-.\\s]?: 이것은 하이픈 (-), 마침표 (.), 또는 공백 문자 (\\s) 중 하나와 일치하는 문자 집합[]입니다.?는 이 구분 기호를 선택 사항으로 만듭니다.\\d{3}: 정확히 세 자리 숫자와 일치합니다.[-.\\s]?: 선택적 하이픈, 마침표 또는 공백 구분 기호와 다시 일치합니다.\\d{4}: 정확히 네 자리 숫자와 일치합니다.
이제 이 패턴은
123-456-7890,(123) 456-7890,123.456.7890,123 456 7890및 심지어1234567890(구분 기호 없이) 와 같은 형식과 일치할 수 있습니다.이제 이 새로운 패턴을 다른 전화번호 형식으로 테스트해 보겠습니다.
phoneNumber문자열을 몇 가지 다른 예제로 바꿉니다.import java.util.regex.Matcher; import java.util.regex.Pattern; public class HelloJava { public static void main(String[] args) { String[] phoneNumbers = { "123-456-7890", "(123) 456-7890", "123.456.7890", "123 456 7890", "1234567890", "invalid-number", // This should not match "123-456-789" // This should not match }; String regex = "\\(?\\d{3}\\)?[-.\\s]?\\d{3}[-.\\s]?\\d{4}"; // More flexible regex pattern Pattern pattern = Pattern.compile(regex); for (String phoneNumber : phoneNumbers) { Matcher matcher = pattern.matcher(phoneNumber); boolean isMatch = matcher.matches(); if (isMatch) { System.out.println(phoneNumber + " is a valid phone number format."); } else { System.out.println(phoneNumber + " is not a valid phone number format."); } } } }여러 입력을 쉽게 테스트하기 위해
String배열phoneNumbers를 도입하고, 이를 반복하기 위해for루프를 도입했습니다.파일을 저장합니다 (Ctrl+S 또는 Cmd+S).
터미널에서 프로그램을 컴파일합니다.
javac HelloJava.java컴파일된 프로그램을 실행합니다.
java HelloJava다음과 유사한 출력을 볼 수 있으며, 어떤 문자열이 패턴과 일치하는지 보여줍니다.
123-456-7890 is a valid phone number format. (123) 456-7890 is a valid phone number format. 123.456.7890 is a valid phone number format. 123 456 7890 is a valid phone number format. 1234567890 is a valid phone number format. invalid-number is not a valid phone number format. 123-456-789 is not a valid phone number format.
이제 몇 가지 일반적인 전화번호 형식을 처리할 수 있는 더 강력한 Regex 패턴을 만들었습니다. 이는 문자열을 유효성 검사하고 구문 분석하기 위한 Regex 의 강력함과 유연성을 보여줍니다.
요약
이 Lab 에서는 Java 에서 정규 표현식 (Regex) 을 사용하여 문자열이 전화번호 형식과 일치하는지 확인하는 방법을 배웠습니다. 먼저 Regex 의 개념과 패턴 매칭, 특히 다양한 전화번호 형식을 처리하는 데 있어서의 중요성을 이해하는 것으로 시작했습니다. 그런 다음 java.util.regex 패키지를 활용하는 간단한 Java 프로그램을 만들었습니다.
첫 번째 단계는 "XXX-XXX-XXXX" 형식을 일치시키기 위해 기본 Regex 패턴 \\d{3}-\\d{3}-\\d{4}를 만드는 것이었습니다. Pattern.compile()을 사용하여 regex 를 Pattern 객체로 컴파일하고, Pattern.matcher()를 사용하여 입력 문자열에 대한 Matcher 객체를 만들었습니다. 마지막으로, matcher.matches()를 사용하여 전체 문자열이 패턴과 일치하는지 확인하고 결과를 출력했습니다. 이는 Java 에서 Regex 를 사용하여 전화번호를 유효성 검사하기 위한 기반을 마련했습니다.



