자바 정규식(Regular Expression) 정리

KIMYEONGJUN·2024년 1월 28일
1

목적

인턴 실습할때도 그렇고 정규식을 접할때가 있었는데 그때마다 인터넷에서 찾아서하면 되겠지라는 생각으로 했는데 코테를 풀면서 이번에는 제대로 정리를해서 내 머리속에 넣어야겠다는 생각이 들어서 정리할려고 한다.

정규표현식(Regular Expression)는 문자열 데이터 중에서 원하는 조건(패턴)과 일치하는 문자열 부분을 찾아내기 위해 사용하는 것으로 미리 정의된 기호와 문자를 이용해서 작성한 문자열을 말한다.

정규식을 이용하면 많은 양의 텍스트 파일 중에서 원하는 데이터를 손쉽게 뽑아낼 수 있고, 입력된 데이터가 형식에 맞는지 체크할 수도 있다. 하지만 위의 사진을 보듯이 복잡한 문자 기호 조합으로 가독성이 떨어진다는 단점도 있다.

자바외에 대부분의 언어들도 정규표현식을 지원한다. 다만 그 사용법들이 언어마다 약간 차이가 있지만 90% 이상은 동일한 문법을 차용하기 때문에 한번 익혀두면 다른 언어의 정규식을 이용하는데 있어 수원해 질 수 있다.

정규식 문법 기호 모음

기호설명예제
.임의의 문자 1개를 의미
^시작을 의미한다 []괄호 안에 있다면 일치하지 않는 부정의 의미로 쓰인다.^a : a로 시작하는 단어, [^a] : a가 아닌 철자인 문자 1개
$$앞의 문자열로 문자가 끝나는지를 의미한다.a$ : a로 끝나는 단어
[][] 괄호 안의 문자가 있는지를 확인한다.[ab][cd] : a,b중 한 문자와 c,d중 한 문자 -> ac ad bc bd
[^][] 대괄호 안에 ^ 문자가 있으면, 제외를 뜻함, 대괄호 안에 ^ 가 쓰이면 제외의 뜻, 대괄호 밖에 ^ 가 쓰이면 시작점의 뜻[^a-z] : 알파벳 소문자 a부터 z까지를 제외한 모든 문자
-사이의 문자 혹은 숫자를 의미한다.[a-z] : 알파벳 소문자 a부터 z까지 하나, [a-z0-9] : 알파벳 소문자 전체,0~9 중 한 문자
|또는[a|b] : a 혹은 b
()그룹01(0|1) : 01뒤에 0 또는 1이 들어간다→ 010(o), 011(o), 012(x)
{}개수a{3}b : a가 3번 온 후 b가 온다→ aab(x), aaab(o), aaaab(o)
\b공백, 탭, ",", "/" 등을 의미한다apple\b : apple뒤에 공백 탭등이 있다 → apple juice(o), apple.com(x)
\B\b의 부정(공백, 탭 등이 아닌 문자)apple\B→ apple.com(o)
\d0~9 사이의 숫자, [0-9]와 동일
\D\d의 부정(숫자가 아닌 문자), [^0-9]와 동일
\s공백, 탭
\S공백, 탭이 아닌 문자
\w알파벳 대소문자+숫자+"_", [a-zA-Z_0-9]와 동일
\W\w의 부정(알파벳 대소문자+숫자+"_" 제외한 문자), [^a-zA-Z_0-9]

정규 수량 기호

기호설명예제
?앞의 표현식이 없거나 최대 1개a1? : 1이 최대 한개만 있거나 없을수도 있다 → a(o), a1(o), a11(x), a111(x)
*앞의 표현식이 없거나 있거나(여러 개)a1* : 1이 있을수도 없을수도 있다 → a(o), a1(o), a11(o), a111(o)
+앞의 표현식이 1개 이상(여러개 가능)a1+ : 1이 1개 이상 있다 → a(x), a1(o), a11(o), a111(o)
{n}앞의 표현식이 딱 n개 반복a{3} : a가 딱 3개 있다 → aa(x), aaa(o), aaaa(x), aaaaaaa(x)
{n,m}앞의 표현식이 최소 n개 , 최대 m개 반복a{3,5} : a가 3개 이상 5개 이하 있다 → aa(x), aaa(o), aaaa(o), aaaaaaa(x)
{n,}앞의 표현식이 n개 이상a{3,} : a가 3개 이상 있다 → aa(x), aaa(o), aaaa(o), aaaaaaa(o)

정규식 그룹 캡쳐 기호

기호설명
()그룹 및 캡쳐
(?:)찾지만 그룹에 포함 안됨
(?=)=앞 문자를 기준으로 전방 탐색
(?<=)=뒤 문자를 기준으로 후방 탐색

자주 사용되는 정규식 샘플

정규 표현식설명
^[0-9]*$숫자
^[a-zA-Z]*$영문자
^[가-힣]*$한글
\w+@\w+\.\w+(\.\w+)?E-mail
^\d{2,3}-\d{3,4}-\d{4}$전화번호
`^01(?:01
\d{6} - [1-4]\d{6}주민등록번호
^\d{3}-\d{2}$우편번호

자바 정규식 문법

String 클래스의 정규식 문법

String 문자열에 바로 정규표현식을 적용하여 필터링이 가능하다.
String 클래스에서 지원하는 정규식 메소드로는 3가지가 있다.

String 정규식 메서드설명
boolean matches(String regex)인자로 주어진 정규식에 매칭되는 값이 있는지 확인
String replaceAll(String regex, String replacement)문자열내에 있는 정규식 regex와 매치되는 모든 문자열을 replacement 문자열로 바꾼 문자열을 반환
String[] split(String regex)인자로 주어진 정규식과 매치되는 문자열을 구분자로 분할

matches 예제

// matches (일치하는지 확인)
String txt = "123456";
boolean result1 = txt.matches("[0-9]+"); // 숫자로 이루어져 있는지
System.out.println(result1); // true

replaceAll 예제

// replaceAll (정규표현식과 일치하는 모든 값 치환)
String txt2 = "power987*-;";
String result2 = txt2.replaceAll("[^a-z0-9]","0"); // 영문자와 숫자를 제외한 문자를 모두 0으로 치환
System.out.println(result2); // power987000

split 예제

// split (정규표현식과 일치하는 값 기준으로 나누기)
String txt3 = "power987*-;";
String[] txts = txt3.split("[0-9]+"); // 숫자부분을 기준으로 분할
System.out.println(txts[0]); // power
System.out.println(txts[1]); // *-;

regex 패키지 클래스

자바에서 정규 표현식 전문적으로 다루는 클래스인 java.util.regex 패키지를 제공해준다. 패키지 안의 클래스중 주로 Pattern 클래스와 Matcher 클래스가 사용된다.

이들 정규식 클래스의 장점으로는 정규식을 Pattern 객체로 미리 컴파일 해둘수 있어서 처리 속도가 좀 더 빠르고, 매칭된 데이터를 좀더 상세히 다룰 수 있다.

Pattern 클래스

클래스명에서 볼수 있다싶이, 이 클래스의 주요 역할은 문자열을 정규표현식 패턴 객체로 변환해주는 역할을 한다. 물론 이때 문자열을 정규식 문법에 알맞게 구성해주어야 한다. 그렇지않으면 예외(Exception)이 발생하게 된다.

Pattern 클래스는 일반 클래스처럼 공개된 생성자를 제공하지 않는다. 그래서 정규식 패턴 객체를 생성하려면 compile() 정적 메서드를 호출해야 한다. 이렇게 Pattern 객체로 컴파일된 정규식은 뒤의 Matcher 클래스에 사용된다.

// 문자열 형태의 정규표현식 문법을 정규식 패턴으로 변환
String patternString = "^[0-9]*$";
Pattern pattern = Pattern.compile(patternString); // Pattern 객체로 컴파일된 정규식은 뒤의 Matcher 클래스에서 사용된다

혹은 바로 matches() 메소드를 활용하여 정규식 검증을 할 수도 있다.

matches() 메서드의 첫번째 입력값은 정규식 문자열이고, 두번째 입력값은 검증 대상 문자열이다. 검증 후 대상문자열이 정규표현식과 일치하면 true, 그렇지 않다면 false 값으로 리턴한다.

// 샘플 문자열
String txt1 = "123123";
String txt2 = "123이것은숫자입니다00";

boolean result = Pattern.matches("^[0-9]*$", txt1); // 첫번째 매개값은 정규표현식이고 두번째 매개값은 검증 대상 문자열
System.out.println(result); // true

boolean result2 = Pattern.matches("^[0-9]*$", txt2);
System.out.println(result2); // false
Pattern 클래스 메서드설명
compile(String regex)정규표현식의 패턴을 작성
matches(String regex, CharSequence input)정규표현식의 패턴과 문자열이 일치하는지 체크일치할 경우 true, 일치하지 않는 경우 false를 리턴(일부 문자열이 아닌 전체 문자열과 완벽히 일치 해야한다)
asPredicate()문자열을 일치시키는 데 사용할 수있는 술어를 작성
pattern()컴파일된 정규표현식을 String 형태로 반환
split(CharSequence input)문자열을 주어진 인자값 CharSequence 패턴에 따라 분리

Matcher 클래스

Matcher 클래스는 대상 문자열의 패턴을 해석하고 주어진 패턴과 일치하는지 판별하고 반환된 필터링된 결과값들을 지니고 있다. Matcher 클래스 역시 Pattern 클래스와 마찬가지로 공개된 생성자가 없다. Matcher 객체는 Pattern 객체의 matcher() 메소드를 호출해서 얻는다.

메서드설명
find()패턴이 일치하는 경우 true를 반환, 불일치하는 경우 false반환(여러개가 매칭되는 경우 반복실행하면 일치하는 부분 다음부터 이어서 매칭됨)
find(int start)start 위치 이후부터 매칭검색
start()매칭되는 문자열의 시작위치 반환
start(int group)지정된 그룹이 매칭되는 시작위치 반환
end()매칭되는 문자열 끝위치의 다음 문자위치 반환
end(int group)지정된 그룹이 매칭되는 끝위치의 다음 문자위치 반환
group()매칭된 부분을 반환
group(int group)그룹화되어 매칭된 패턴중 group 번째 부분 반환
groupCount()괄호로 지정해서 그룹핑한 패턴의 전체 개수 반환
matches()패턴이 전체 문자열과 일치할 경우 true반환(일부 문자열이 아닌 전체 문자열과 완벽히 일치 해야한다)

마무리

정규식 정리하기 전까지 이렇게 양이 이렇게 방대한줄 몰랐는데 조금씩 정리하고 나니깐 아주 조금은 알것도같다. 그렇지만 아직 많이 부족하게 느껴지는것같다.

profile
Junior backend developer

0개의 댓글