티스토리 뷰
원래 정규표현식은 이해하기 어렵고 쓰기 복잡해서 꺼리고 있었다.
이번주 토요일에 있을 카카오 신입공채 코딩테스트를 대비하기 위해 작년 1차 문제를 풀어보다 "아 이문제 정규식 쓰면 정말 간단하게 풀릴것 같은데?!" 하는 생각이 들었다.
(바로 이문제이다)
알파벳, 숫자, 특수문자 남기기에는 성공했다.
하지만 .의 개수가 2개 이상일 때 전부 . 하나로 바꾸기 이것도 분명 정규식으로 할 수 있을것 같은데 못찾았다...
그래서 결국 split("\\.")
으로 String
을 쪼개고 StringBuilder
객체를 만들고 array element
가 비어있지 않으면 StringBuilder
에 append
해서 하는 등 했는데
역시나! 다 풀고 다른 사람의 풀이를 보니 이걸 깔끔하게 정규식으로 처리하신 분이 있었다 👍🏻👍🏻
그래서 기본적인 개념만 정리해보았다. 더 알게되면 계속 수정해야겠다 😊
추가로 true
, false
를 반환하는 matches
method도 간단한 예시를 들었다.
public String replaceAll(String regex, String replacement)
regex
의 조건에 충족하는 문자를 해당 String에서replacement
로 바꿔준다.
regex
[]
내부에 원하는 내용을 작성하면 된다.- 앞에
^
을 붙이면 문자열 앞에서부터[]
- 뒤에
$
을 붙이면 문자열 뒤에서부터[]
안의 내용을 검사할 수 있다. - 디폴트는
[]
안의 내용을 필터링하는 것이지만
안에^
을 붙이고 시작하면 not이라는 의미로 반대로[]
안을 만족하는 내용만 필터링이 된다.
- 앞에
내용
- 대소문자, 숫자는 -를 이용해서 범위를 지정할 수 있다.
- 대문자: A-Z
- 소문자: a-z
- 숫자: 0-9
- 그 밖의 내용 (특수문자)은 ,나 띄어쓰기 없이 바로 붙여쓰면 된다.
- 만약 알파벳이나 숫자도 특정 글자만 쓰고 싶다면 한 글자를 써주면 된다.
- 특수문자에 따라 그냥 써도 되는 것,
[]
로 감싸주거나\\
를 앞에 붙여줘야 하는 경우가 있다.case 종류 그냥 써도 됨 ! # % & @ `: ; - _ . < > , ~ ' []
로 감싸줘야 함* + $ | 앞에 \\\\
을 붙여줘야 함( ) { } [ ] ^ - 만약 범위를 지정하고 싶다면
[]
뒤에{}
를 붙여 숫자를 써주면 된다. - 논리 연산자
| (OR)
을 이용하여 정규식 여러 개를 묶을 수도 있다.
- 만약 범위를 지정하고 싶다면
예시
static String str = "abcde___ABCDE__01234_-!";
// A~Z만 없앤다.
System.out.println(str.replaceAll("[A-Z]", ""));
// abcde_____01234_-!
// A~Z만 남긴다.
System.out.println(str.replaceAll("[^A-Z]", ""));
// ABCDE
// 2개 이상의 _가 나올 경우 _로 치환한다.
System.out.println(str.replaceAll("[_]{2,}", "_"));
// abcde_ABCDE_01234_-!
// 맨 앞이 소문자로 시작하거나, 대문자가 2개 이상 나오거나, 맨 끝이 ?나 !면 hello로 치환한다.
System.out.println(str.replaceAll("^[a-z]|[A-Z]{2,}|[?!]$", "hello"));
// hellobcde___hello__01234_-hello
public boolean matches(String regex)
regex
가 맞으면true
, 틀리면false
를 반환한다.if
문이나switch
문을 아주 간단하게 할 수 있지 않을까 생각이 된다. 🤔
예시
- 주어진 숫자들이 아래 범위를 만족하는지 알고 싶다.
- 1190-1199 이거나
- 1200-1999 이거나
- 2000-9999
119[0-9]|1[2-9][0-9]{2}|[2-9][0-9]{3}
- 1000-1899 이거나
- 1900-1980 이거나
- 1990-1992
1[0-8][0-9]{2}|19[0-8][0-9]|199[0-2]
String values = "1000 1100 1180 1189 1190 1191 1199 1200 1290 1900 1980 1989 " +
"1990 1991 1992 1993 1999 2000 3000 2991 9999";
String[] arr = values.split(" ");
for (String num : arr)
System.out.println(num.matches("119[0-9]|1[2-9][0-9]{2}|[2-9][0-9]{3}"));
'알고리즘' 카테고리의 다른 글
[프로그래머스] 문자열 압축 (Java) (0) | 2021.10.07 |
---|---|
[백준] 7682. 틱택토 (Java) (0) | 2021.09.16 |
[백준] 1107. 리모컨 (Java) (0) | 2021.08.23 |
[백준] 9019. DSLR (Java) (0) | 2021.08.16 |
[백준] 19238. 스타트 택시 (Java) (0) | 2021.08.16 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- dfs
- 브루트포스
- 우선순위큐
- 구현
- java
- regex
- 알고리즘
- form
- 이분탐색
- 백트래킹
- swea
- 그래프
- 벨만포드
- 해시
- REACT
- 다익스트라
- dp
- CustomHook
- 백준
- BFS
- Validation
- 삼성역테기출
- 문자열
- 프로그래머스
- 시뮬레이션
- 정규식
- vue.js
- web
- BigInteger
- matches
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함