정규 표현식(Regular Expressions) 소개
- 정규 표현식이란?
-정규표현식은 줄여서 Regex 라고도 부립니다.
- 택스트에서 특정 문자열 패턴을 정의하고 찾아내기 위한 강력한 도구입니다.
-이는 문자열 검색, 대체 , 분할 등 다양한 텍스트 처리 작업을 위한 간결하고 유연한 방법을 제공합니다
- 정규 표현식의 용도
검증(Validation): 사용자 입력이 특정 형식을 따르고 있는지 확인합니다. 예를 들어, 이메일 주소, 전화번호, 우편번호 등의 유효성을 검사할 때 사용됩니다.
검색(Search): 대규모 텍스트 내에서 특정 패턴이나 단어 조합을 찾는 데 사용됩니다. 예를 들어, 웹 페이지에서 특정 단어나 문구를 찾거나, 로그 파일에서 특정 이벤트 패턴을 검색하는 데 사용할 수 있습니다.
텍스트 추출 및 변환(Extraction and Transformation): 텍스트 데이터에서 필요한 정보를 추출하거나, 데이터 형식을 변환하는 데 사용됩니다. 예를 들어, 문서나 로그 파일에서 날짜, 시간, 특정 태그가 달린 문자열을 추출할 수 있습니다.
문자열 대체(Replacement): 텍스트 내에서 특정 패턴을 찾아 다른 문자열로 대체합니다. 이는 데이터 정제, 형식 변경 등에 유용하게 사용됩니다.
분할(Splitting): 정규 표현식을 사용하여 문자열을 여러 부분으로 나누는 데 사용됩니다. 예를 들어, 쉼표나 공백 등의 구분자를 사용하여 입력된 데이터를 여러 부분으로 분할할 수 있습니다.
정규표현식은 사용법이 복잡하고 어렵게 느껴지지만 한번 익숙해지면 텍스트 검증이 쉬워지기에 배워보시면 좋습니다.✔
자바에서의 정규 표현식 사용
- java.util.regex 패키지 소개
- java.util.regex 패키지는 정규 표현식을 위한 클래스와 인터페이스를 제공합니다
- 주요 클래스 소개 (Pattern, Matcher)
Pattern
Pattern 클래스는 정규 표현식의 컴파일된 표현을 나타냅니다. 정규 표현식을 사용하기 위해서는 먼저 Pattern 클래스를 통해 표현식을 컴파일해야 합니다. 이 과정에서 정규 표현식이 유효한지 검증되며, 이후 Matcher 객체를 생성하는 데 사용됩니다.
Matcher
Matcher 클래스는 Pattern 객체에 의해 정의된 정규 표현식과 일치하는 문자열 영역을 찾기 위한 엔진입니다. Matcher 객체는 특정 입력 문자열 내에서 패턴 검색을 수행하고, 일치하는 부분을 찾아내는 다양한 메소드를 제공합니다.
기본 구문(Syntax) 및 문자 클래스
정규 표현식을 이해하고 효과적으로 사용하기 위해서는 기본 구문과 문자 클래스에 대한 이해가 필수적입니다. 정규 표현식은 다양한 메타 문자와 리터럴, 문자 클래스를 사용하여 복잡한 문자열 패턴을 표현할 수 있습니다.
- 메타 문자(Meta Characters) 소개
메타 문자는 정규 표현식에서 특별한 의미를 가지는 문자입니다. 이러한 문자들은 패턴 매칭의 규칙을 정의하는 데 사용됩니다. 다음은 자주 사용되는 몇 가지 메타 문자입니다:
- .: 어떤 한 문자와도 일치(단, 줄바꿈 문자는 제외)
- ^: 문자열의 시작과 일치
- $: 문자열의 끝과 일치
- ``: 바로 앞의 문자가 0번 이상 반복되는 경우와 일치
- +: 바로 앞의 문자가 1번 이상 반복되는 경우와 일치
- ?: 바로 앞의 문자가 0번 또는 1번 등장하는 경우와 일치
- |: 두 패턴 중 하나와 일치 (OR 연산)
- (): 괄호 안의 문자를 하나의 그룹으로 처리
- []: 괄호 안의 어떤 한 문자와 일치하는 문자 클래스
- {}: 앞 문자의 반복 횟수를 지정
- 리터럴(Literals)
리터럴은 메타 문자가 아닌 일반 텍스트 문자를 의미합니다. 정규 표현식에서 대부분의 문자들은 그 자체로 해석되며, 이러한 문자들을 리터럴이라고 합니다. 예를 들어, abc 는 "a", "b", "c" 세 문자가 연속적으로 나타나는 문자열과 정확히 일치합니다.
- 문자 클래스(Character Classes) 이해
문자 클래스는 특정한 문자 집합 중 하나와 일치시키고자 할 때 사용됩니다. 문자 클래스는 대괄호 [] 안에 문자들을 나열하여 정의합니다
- \\d: 숫자와 일치 [0-9]와 동일
- \\D: 숫자가 아닌 문자와 일치 [^0-9]와 동일
- \\s: 공백 문자와 일치 (공백, 탭 등)
- \\S: 공백 문자가 아닌 것과 일치
- \\w: 단어를 구성하는 문자와 일치 [a-zA-Z_0-9]와 동일
- \\W: 단어를 구성하지 않는 문자와 일치 [^\w]와 동일
- 사용자 정의 문자 클래스
- [abc]: "a", "b", "c" 중 하나와 일치
- [^abc]: "a", "b", "c"를 제외한 모든 문자와 일치
- [a-z]: 소문자 알파벳 중 하나와 일치
- [A-Z]: 대문자 알파벳 중 하나와 일치
- [0-9]: 숫자 중 하나와 일치
자주 사용하는 정규 표현식 패턴
- 이메일 주소 검증
^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}$
^ -> 문자열의 시작을 의미합니다. 이메일 주소가 이 정규 표현식으로 시작된다는걸 나타냅니다.
[A-Za-z0-9._%+-] -> A-Z 대문자 알파뱃 , a-z 소문자 알파뱃 ,0-9까지 **._%+-** 특수문자
+ ->앞의 문자 클래스([A-Za-z0-9._%+-])가 한 번 이상 반복되어야 함을 나타냅니다. 이는 이메일의 사용자 이름 부분이 최소 한 글자 이상이어야 함을 의미합니다.
@ ->리터럴 문자로, 이메일 주소에서 사용자 이름과 도메인을 구분하는 '@' 기호와 정확히 일치해야 함을 나타냅니다.
[A-Za-z0-9.-] : 이메일 주소의 도메인 이름에서 허용되는 문자를 정의합니다. 사용자 이름 부분과 유사하지만, 도메인 부분에서 특정 특수 문자만을 허용합니다.
A-Z, a-z, 0-9 : 대소문자 알파벳과 숫자
. : 점 (도메인 이름의 일부로 사용됨)
- : 하이픈 (도메인 이름의 일부로 사용됨)
\\. : 도메인 이름과 최상위 도메인(TLD)을 구분하는 점(.)을 리터럴 문자로 나타냅니다. \\는 메타 문자인 점(.)을 일반 문자로 해석하게 하는 이스케이프 문자입니다.
****
[A-Za-z]{2,6} : 최상위 도메인(TLD)에서 허용되는 문자를 정의합니다. 이는 최소 2글자에서 최대 6글자 사이의 대소문자 알파벳을 의미합니다. 일부 최신 TLD는 이 범위를 벗어나기도 하므로, 실제 사용 시에는 범위를 조정할 필요가 있을 수 있습니다.
$ : 문자열의 끝을 나타냅니다. 이메일 주소가 이 정규 표현식으로 끝나야 함을 의미합니다.
정규 표현식의 한계와 주의 사항
- 처리 속도와 성능 고려
- 백트래킹(Backtracking)의 비용: 정규 표현식 엔진은 일치하는 문자열을 찾기 위해 백트래킹 알고리즘을 사용합니다. 이 과정에서 엔진은 이미 검사한 문자열의 위치로 돌아가 다른 가능성을 탐색합니다. 이러한 백트래킹은 특히 "욕심 많은" 양자(``, +)와 함께 복잡한 패턴에서 성능 저하를 일으킬 수 있습니다.
자바의 정규 표현식 실전 사용법
- Pattern 클래스 사용 예제
public static void main(String[] args) {
String text = "The rain in Spain stays mainly in the plain.";
String patternString = "ain";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
System.out.println("Found at: " + matcher.start() + " to " + matcher.end());
}
}
Found at: 5 to 8
Found at: 14 to 17
Found at: 25 to 28
Found at: 40 to 43
"ain" 패턴을 찾기 위해 Pattern과 Matcher를 사용합니다. find() 메소드를 통해 텍스트 내에서 반복적으로 해당 패턴을 검색하고, 매칭되는 각 부분의 시작과 끝 인덱스를 출력
- Matcher 클래스 사용 예제
public static void main(String[] args) {
String text = "John writes about this, and John Doe writes about that, and John Wayne writes about everything.";
String patternString = "John";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(text);
int count = 0;
while (matcher.find()) {
count++;
System.out.println("Match number " + count);
System.out.println("start(): " + matcher.start());
System.out.println("end(): " + matcher.end());
}
}
Match number 1
start(): 0
end(): 4
Match number 2
start(): 28
end(): 32
Match number 3
start(): 60
end(): 64
"John"이라는 단어가 텍스트 내에서 등장하는 모든 위치를 찾아내고, 각 매칭의 시작과 끝 인덱스를 출력
- 정규 표현식을 활용한 문자열 분리(split), 검색(find), 매칭(matches), 대체(replace)
public static void main(String[] args) {
String text = "one:two:three:four";
String[] results = text.split(":");
for(String result : results) {
System.out.println(result);
}
}
one
two
three
four
public static void main(String[] args) {
String text = "john.doe@example.com";
String patternString = "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\\\.[A-Za-z]{2,6}$";
boolean matches = Pattern.matches(patternString, text);
System.out.println("Matches: " + matches);
}
Matches: true
String text = "The rain in Spain falls mainly on the plain.";
String replacedText = text.replaceAll("ain", "ain(FOUND)");
System.out.println(replacedText);
The rain(FOUND) in Spain(FOUND) falls main(FOUND)ly on the plain(FOUND).
정규표현식을 공부하기에 좋은 사이트
RegExr: Learn, Build, & Test RegEx
RegExr is an online tool to learn, build, & test Regular Expressions (RegEx / RegExp).
regexr.com
RegexOne - Learn Regular Expressions - Lesson 1: An Introduction, and the ABCs
Regular expressions are extremely useful in extracting information from text such as code, log files, spreadsheets, or even documents. And while there is a lot of theory behind formal languages, the following lessons and examples will explore the more prac
regexone.com
'컴퓨팅사고' 카테고리의 다른 글
SOLID 의 개념과 스프링 부트 예시😁 ( OOP ) ⊙.☉ (0) | 2024.04.03 |
---|---|
CORS 를 허용해보자 그리고 CSRF? (1) | 2024.04.02 |
s/w problem solving (1) (0) | 2023.07.04 |