[Java] 정규표현식 사용하기

Kim Ji Eun·2022년 4월 20일
0

Java

목록 보기
6/9

프로그래머스 신규 아이디 추천이라는 문제를 풀며 정규표현식의 중요성을 알게 되었다.
실제 코딩테스트에서 검색이 불가능하다면 정규식을 머릿속으로 떠올려야하는데, 정규식을 암기하지 않으면 써먹을 수 없기 때문이다.

정규표현식

정규표현식이란 특정한 규칙을 가진 문자열의 집합을 표현하는데 사용하는 형식 언어

정규표현식 문법

  • [] 한개의 문자
    ex) [abc]- abc 중 하나의 문자
    [^abc] - abc 이외 하나의 문자
    [a-zA-Z] - a-zA-Z 중 하나의 문자
  • [xy] - x 또는 y 한 문자
  • [x-z] - x-z 범위내의 한 문자
  • [^xy] - x 또는 y를 제외한 한 문자
  • [x]{n} - x가 정확히 n개
  • [x]{n,} - x가 n개 이상
  • [x]{n,m} - n 이상 m 이하 반복
  • ^[x] - x로 문자열 시작
  • [x]$ - x로 문자열 종료
  • x* - x의 0번이상 반복
  • x+ - x의 1번 이상 반복
  • [a-zA-Z]+ - a-zA-Z로 이루어진 문자열
  • .x - 임의의 문자하나
        String pt2 = "a.c";
        String s = "abc";
        String s2 = "ac";
        String s3 = "abbbc";
        System.out.println(Pattern.matches(pt2, s)); // true
        System.out.println(Pattern.matches(pt2, s2)); // false
        System.out.println(Pattern.matches(pt2, s3)); // false
  • x? - x가 존재할 수도, 하지 않을 수도 있음
    ex) ab?c : ac, abc

            String pt = "ab?c";
            String s = "abc";
            String s2 = "ac";
            String s3 = "abbbc";
    
            System.out.println(Pattern.matches(pt, s)); // true
            System.out.println(Pattern.matches(pt, s2)); // true
            System.out.println(Pattern.matches(pt, s3)); // false
    
  • x|y - x또는 y

replaceAll 사용하기

한 문자열 내에서 특정 조건에 부합하는 일부를 다른 문자열로 치환하고 싶을 때 replaceAll을 사용한다.

        answer = answer.replaceAll("[^-_.a-z0-9]",""); // a~z, A~Z, -, _, . 제외하고 삭제
        answer = answer.replaceAll("[.]{2,}","."); //.이 2개 이상이면 .하나로 치환
        answer = answer.replaceAll("^[.]|[.]$",""); // .으로 시작하고 .으로 끝나면 .을 제거 

Pattern 클래스 사용하기

정규 표현식의 Pattern클래스의 matches(패턴, 비교할문자열)메서드를 사용하여 해당문자열이 패턴과 일치하는지 확인한다.

import java.util.regex.Pattern;

public class practice {
    public static void main(String[] args) {
        String pt = "name : [a-zA-Z]+ nickname : [a-zA-z]+";
        String s = "name : db nickname : name";
        String s2 = "name : dd Nickname : name";

        System.out.println(Pattern.matches(pt, s)); // true
        System.out.println(Pattern.matches(pt, s2)); // false
    }
}

참고) 신규 아이디 추천 코드

import java.util.*;
import java.io.*;
class Solution {
    public String solution(String new_id) {
        String answer = "";
        new_id = new_id.toLowerCase();
        new_id = new_id.replaceAll("[^-_.a-z0-9]","");
        new_id = new_id.replaceAll("[.]{2,}",".");
        new_id = new_id.replaceAll("^[.]|[.]$","");
         System.out.println(new_id);
        if(new_id.length()==0) new_id="a";
        
        if(new_id.length()>=16) {
            new_id = new_id.substring(0,15);
            new_id = new_id.replaceAll("[.]$","");
        }
        if(new_id.length()<=2){
            while(new_id.length()<3){
                new_id+=new_id.substring(new_id.length()-1);
            }
        }
        return new_id;
    }
}

정규식참고
https://velog.io/@minji/Java-%EC%A0%95%EA%B7%9C%ED%91%9C%ED%98%84%EC%8B%9DString.replaceAll-%EB%A9%94%EC%84%9C%EB%93%9C%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%B9%98%ED%99%98

https://zzang9ha.tistory.com/322

신규아이디 추천 문제
https://programmers.co.kr/learn/courses/30/lessons/72410

profile
Back-End Developer

0개의 댓글