
정규 표현식이란?
정규 표현식은 특정한 패턴을 이루고 있는 문자들이 나열된 것으로, 글이 하나 있다고 가정할 때 그 안에서 내가 원하는 특정한 패턴의 문자를 찾을 때 사용한다.
자바에서 정규 표현식은 java.util.regex 패키지 안에 있는 클래스들을 활용하여 사용한다.
1️⃣ Pattern 클래스 : 패턴을 정의한다.
2️⃣ Matcher 클래스 : 패턴을 사용해 문자를 찾는 역할을 한다.
3️⃣ PatternSynctaxException 클래스 : 정규 표현식 패턴의 구문 오류를 나타낸다.
예제 1(Matcher, Pattern, find())
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
Pattern pattern = Pattern.compile("w3schools", Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher("Visit W3Schools!");
boolean matchFound = matcher.find();
if(matchFound) {
System.out.println("Match found");
} else {
System.out.println("Match not found");
}
}
}
- Pattern.compile() 메소드를 사용해 "w3schools"를 대/소문자 구분없이 검색하기 위해 패턴을 만든다.
➡️ Pattern.compile()의 첫 번째 파라미터는 문장 안에서 찾을 패턴이고, 두 번째 파라미터는 선택 사항으로 어떻게 검색할지 지정하기 위해 사용한다.
- pattern.matcher() 메소드를 사용해 Matcher 객체에 해당 문자열에 패턴 조건을 검사해서 저장한다.
➡️ matcher()는 패턴을 검색할 때 사용한다.
- matcher.find() 메소드를 사용해 패턴의 일치/불일치 여부를 판단한다.
➡️ find()는 문자열 내에서 패턴을 찾으면 true를 반환하고 그렇지 않으면 false를 반환한다.
Flags
comepile() 메소드 내에서 검색 방법을 지정하기 위해 사용하는 플래그들이다.
1️⃣ Pattern.CASE_INSENSITIVE : 대소문자 무시
2️⃣ Pattern.LITERAL : 패턴 안에 있는 특수 문자를 일반 문자처럼 취급
3️⃣ Pattern.UNICODE_CASE : CASE_INSENSITIVE와 같이 사용하여 영어가 아닌 문자들도 대소문자 무시
예제 2(Matcher, Pattern, find(), group())
private String[] split(String text) {
Matcher m = Pattern.compile("//(.)\n(.*)").matcher(text);
if (m.find()) {
String customDelimeter = m.group(1);
return m.group(2).split(customDelimeter);
}
return text.split(",|:");
}
출처 : 자바 웹 프로그래밍 Next Step
- Pattern.compile("//(.)\n(.*)).matcher(text)
➡️ "//"와 "\n" 사이에 "(.)"는 임의의 한 문자를 하나의 문자로 인식하겠다는 의미로 이 문자로 구분자를 지정한다. 이후에 input값과 패턴 조건을 검색한다.
- m.group()
➡️ group()은 패턴과 일치하는 값이 없을 때까지 매칭되는 일련의 결과 값을 반환하는데 여기서 m.group(1)은 "(.)"을 찾은 결과 값으로 구분자가 반환되고 m.group(2)는 "(.*)"을 찾은 결과 값인 나머지 문자들이 반환된다.
정규 표현식 패턴
표현식 | 설명 |
^ | 문자열의 시작 |
$ | 문자열의 종료 |
. | 임의의 한 문자(\ 제외) |
* | 앞 문자가 없을 수도, 무한정 많을 수도 있음 |
+ | 앞 문자가 하나 이상 |
? | 앞 문자가 없거나 하나 있음 |
[] | 문자의 집합이나 범위 |
{} | 횟수 또는 범위 |
() | 소괄호 안의 문자를 하나의 문자로 인식 |
| | 패턴 안에서 or 연산 수행 |
\s | 공백 문자 |
\S | 공백 문자를 제외한 문자 |
\w | 알파벳이나 숫자 |
\W | 알파벳이나 숫자를 제외한 문자 |
\d | 숫자 [0-9] |
\D | 숫자를 제외한 문자 |
\ | 역슬래시 다음에 일반 문자가 오면 특수 문자로 취급, 특수 문자가 오면 그 문자 자체를 의미 |
(?!) | 앞 부분에 넣어주면 대소문자를 구분하지 않음 |
예제
1️⃣ ^[0-9]*$
0부터 9까지의 수를 글자 수 제한을 하지 않고 검사(숫자면 됨)
2️⃣ ^[a-zA-Z]*$
소문자 a부터 z, 대문자 A부터 Z까지 글자 수를 제한을 하지 않고 검사(알파벳이면 됨)
ref.
'Java' 카테고리의 다른 글
[Java] 객체를 생성하는 다양한 방법 (0) | 2023.01.30 |
---|---|
[Java] String의 불변성은 SCP로부터 (0) | 2023.01.27 |
[Java] Method Area, PermGen 그리고 Metaspace (0) | 2022.10.06 |
JUnit5 (0) | 2022.09.11 |
[JAVA] Guava를 이용한 표기법(네이밍컨벤션) 변경 (0) | 2022.03.04 |