티스토리 뷰

원래 정규표현식은 이해하기 어렵고 쓰기 복잡해서 꺼리고 있었다.

이번주 토요일에 있을 카카오 신입공채 코딩테스트를 대비하기 위해 작년 1차 문제를 풀어보다 "아 이문제 정규식 쓰면 정말 간단하게 풀릴것 같은데?!" 하는 생각이 들었다.

 

(바로 이문제이다)

 

 

코딩테스트 연습 - 신규 아이디 추천

카카오에 입사한 신입 개발자 네오는 "카카오계정개발팀"에 배치되어, 카카오 서비스에 가입하는 유저들의 아이디를 생성하는 업무를 담당하게 되었습니다. "네오"에게 주어진 첫 업무는 새로

programmers.co.kr

 

알파벳, 숫자, 특수문자 남기기에는 성공했다.

하지만 .의 개수가 2개 이상일 때 전부 . 하나로 바꾸기 이것도 분명 정규식으로 할 수 있을것 같은데 못찾았다...

 

그래서 결국 split("\\.")으로 String을 쪼개고 StringBuilder 객체를 만들고 array element가 비어있지 않으면 StringBuilderappend해서 하는 등 했는데

역시나! 다 풀고 다른 사람의 풀이를 보니 이걸 깔끔하게 정규식으로 처리하신 분이 있었다 👍🏻👍🏻

 

그래서 기본적인 개념만 정리해보았다. 더 알게되면 계속 수정해야겠다 😊
추가로 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
링크
«   2024/05   »
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
글 보관함