일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- sonarQube
- Jenkins
- LAN어댑터
- ansible
- Java
- 액세스회선
- 캐시서버
- 소켓
- Pipeline
- STREAM
- DevOps
- docker
- IntelliJ
- jdk
- post
- mybatis
- container
- gradle
- AOP
- Spring
- 방화벽
- cloud
- 허브
- Linux
- Collection
- JPA
- map
- Set
- tomcat
- 라우터
- Today
- Total
거북이-https://velog.io/@violet_evgadn 이전완료
정규표현식 본문
코딩 테스트 시 필요한 이유
정규 표현식(Regular expression;regex)은 특정한 규칙을 가진 문자열의 집합을 표현하는 형식 언어이다.
여러 프로그래밍 언어나 텍스트 편집기에서 정규 표현식을 통한 문자열 검색 및 치환 기능을 지원하고 있어 만약 자유자재로 활용할 수 있다면 매우 강력한 기술이다.
하지만 정규표현식은 "패턴"을 위한 형식 언어이기 때문에 "또 하나의 프로그래밍 언어"라고 할 정도로 문법이 복잡하다.
(사실 필자도 정규표현식 문법을 검색하지 않으면 정규표현식을 제대로 활용하지 못한다.)
코딩 테스트에서 정규 표현식이 필수 지식은 아니다. 왜냐하면 프로그래밍 언어 또한 검색 기능의 함수가 많기 때문에 이들을 잘 조합하면 정규 표현식 비슷한 효과의 함수를 만들 수 있다.
하지만 정규 표현식 및 사용 방법을 알아두면 쉽고 빠르며 코딩 테스트에서 활용하는 정규표현식 문법 또한 한정되어 있으므로 알아두면 좋을 것이라 생각해 정리했다.
정규표현식 문법
◎ 정규표현식 구조
/pattern/flag
Pattern에 정규 표현식 문법이 들어가며 Flag는 아래에서 종류를 설명하겠지만 문자열 검색에 대한 추가 설정을 해주는 것이다.
◎ 코테에서 자주 사용하는 정규 표현식 문법
아래에 나온 P에는 정규 표현식 Pattern이 들어갈 수도 있으며 일반 문자열이 들어갈 수도 있다.
Pattern이 들어갈 경우 해당 패턴을 가진 모든 일반 문자열 기준으로 검색하게 된다.
- ^P : 문자열이 P로 시작됨
- P$ : 문자열이 P로 종료됨
- P* : 문자열에 P가 0번 이상 반복됨
- P+ : 문자열에 P가 1번 이상 반복됨
- [] : 문자 셋
- A-B : A ~ B까지 포함된 모든 문자셋
- AB : A 혹은 B가 들어간 문자셋
- ^A : A를 제외한 문자셋
- (ex) [0-9] : 모든 숫자
- (ex2) [xy] : x 혹은 y
- (ex3) [^xy] : x와 y가 아닌 다른 모든 문자
- \ : 다음에 나오는 특수 기호를 정규 표현식 문법이 아닌 문자 그 자체로 인식함
- \b : 단어 경계
- \bP\b일 경우 Pattern P를 따르는 단어들을 검색한다.
◎ 알아두면 좋은 것
- P? : 문자열에 P가 존재할 수도 있고 존재하지 않을 수도 있음
- P{} : P 문자의 반복에 관한 문법
- P{n} : n번 P가 반복됨
- P{n,} : n번 이상 P가 반복됨
- P{n,m} : n번 이상 m번 이하로 P가 반복됨
- .P : 문자열이 임의 문자 1개 이후 Pattern P로 종료됨
- | : or
- ^P : Line(문장)이 P로 시작됨
- P$ : Line(문장)이 P로 종료됨
- ^와 $는 사실 더 많이 활용된다고도 볼 수 있다. 하지만 문제는 ^와 $는 "문장" 기준으로 검색을 해버린다. 코딩 테스트에서는 문장을 찾기보다는 단어를 찾는 경우가 더 많으므로 ^나 $보다는 단어의 경계를 의미하는 \b를 자주 사용한다.
- 소괄호 안의 문자를 하나의 문자로 인식
◎ Flag
만약 정규표현식을 Flag 없이 사용할 경우 문자열에 대해 검색을 1번만 처리하고 종료한다.
예를 들어 "man man"이라는 text에서 /man/을 검색하면 첫 번째 man만 검색하고 2번째 man은 검색되지 않는 것이다.
따라서 Flag를 사용함으로써 정규표현식을 적용시킬 문자열의 범위를 지정하는 것이다.
- g : Global. 문자열 내의 모든 패턴들을 검색. 가장 많이 활용되는 Flag
- i : Ignore Case. 문자열에 대해 대/소문자를 식별하지 않고 검색
- m : Multi Line. 대상 문자열이 다중 문자열인 경우에도 검색
한 번에 여러 개의 Flag를 사용할 경우 "/pattern/ig"처럼 사용할 Flag를 이어 붙여주기만 하면 된다.
◎ 자주 사용되는 정규표현식
- [0-9]*
- 0~9 사이의 숫자로 시작되어야 하며 모든 패턴이 숫자여야 함
- 숫자로만 되어 있는 문자열 검색
- [a-zA-Z]*
- a ~ z 혹은 A ~ Z 문자열로 시작되고 모든 패턴이 알파벳임
- 영문자로만 되어 있는 문자열 검색(대소문자 상관 X)
- [0-9]{2,3}-[0-9]{3,4}-[0-9]{4}
- 전화번호
Java에서 정규표현식 사용하기
1. 정규 표현식(Regex)을 Pattern Class로 컴파일
Pattern pattern = Pattern.compile(String regex)
"java.util.regex.Pattern" 클래스를 활용하여 Regex(정규 표현식)을 Pattern 클래스로 컴파일시킬 수 있다.
위 코드를 통해 정규표현식을 저장하고 있는 문자열 regex를 Pattern 클래스로 컴파일 시킨다.
2. Compile 한 Pattern 객체를 Matcher의 인자로 넣어 사
1번 과정에서 컴파일시킨 Pattern 객체에 존재하는 matcher() 함수를 사용함으로써 패턴을 찾을 문자열을 주입할 수 있다.
Pattern pattern = Pattern.compile(String regex);
Matcher matcher = pattern.matcher(String str);
위 코드에서 regex는 정규표현식, str은 확인하고 싶은 문자열을 의미한다.
Matcher 클래스의 여러 가지 함수를 통해 문자열이 정규표현식과 매칭되는지 여부와 여러 세부 정보들을 알 수 있다.
matcher.matches()
가장 많이 활용하는 함수이다.
대상 문자열과 패턴이 일치하는 경우 True를 반환한다.
matcher.find(int start)
start 인자 위치부터 매칭 여부를 체크한다.
matcher.start()
매칭되는 문자열의 시작 위치를 반환한다.
matcher.end()
매칭되는 문자열의 끝 바로 다음 위치를 반환한다.
matcher.group()
매칭된 모든 문자열을 부분을 그룹핑하여 반환한다.
matcher.groupCount()
패턴 내 매칭된 모든 문자열을 그룹핑한 그룹의 원소 개수를 반환한다.
'코딩 테스트 시 알면 좋은 것들' 카테고리의 다른 글
비트마스크 (0) | 2023.02.06 |
---|---|
MST - 구현 (0) | 2023.02.06 |
Union-Find 알고리즘 (0) | 2023.02.06 |
MST - 이론 (0) | 2023.02.05 |
Trie (0) | 2023.02.01 |