[Java] 정규표현식을 사용하자

devdo·2021년 7월 30일
0

Java

목록 보기
39/56

정규표현식은 개발을 하는 사람이라면 결국 보게 되는 표현이다.
가장 쉽게 접하는 분야는 회원가입시 아이디, 이메일, 비밀번호 양식을 지정할 때 접하게 된다.

한글, 영어, 특수문자, 이메일 등등 형식을 알고리즘을 통해서 만들게 된 표현식이다.

지금은 너무나 잘 정리된 표현식이라서 잘 활용만 하면 된다!

하지만 가끔 이 정규표현식을 배우기 전 char 형태로 for문을 돌려 원하는 값들을 축출하는 경우가 있다. 정규표현식이라기보단 ASCII코드로 한글자씩 비교분석한 것이다.

올드한 방법이다. 그에 비해 정규표현식은 어떻까? 두가지 방식을 비교해보자!


ASCII코드로 char 축출 방법

        String str = "안녕하세요s1Adj3fl1dldks4@!";

        String hangule = "";
        String engstr = "";
        String num = "";
        String specialstr = "";

        char[] cllit = str.toCharArray();

        for(int i=0; i<cllit.length; i++){

            char cl = cllit[i];
            if('가'<=cl && '힣'>=cl) {
                hangule += Character.toString(cl);
            } else if('a' <= cl && 'z'>= cl){
                engstr += Character.toString(cl);
            } else if(Character.isDigit(cl)){
                num += Character.toString(cl);
            } else {
                specialstr += Character.toString(cl);
            }

        }
        System.out.println(hangule);
        System.out.println(engstr);
        System.out.println(num);
        System.out.println(specialstr);

어떤가. ASCII코드로 분리하는 것도 있지만,
애초에 wrapper 클래스내 메서드에서 알파벳, 숫자들만 골라서 쓸 수 있는 메서드도 존재한다.


정규표현식 방법

정규표현식설명
^문자열 시작
$문자열 종료
.임의의 한 문자(단 \은 넣을 수 없음)
*앞 문자가 없을 수도 무한정 많을 수도 있음
+앞 문자가 하나 이상
?앞 문자가 없거나 하나 있음
[ ]문자의 집합이나 범위를 나타내며 두 문자 사이는 - 기호로 범위를 나타냅니다. [] 내에서 ^ 가 선행하여 존재하면 not을 나타낸다.
{ }횟수 또는 범위를 나타냅니다.
( )소괄호 안의 문자를 하나의 문자로 인식
패턴 안에서 or 연산을 수행할 때 사용
\ 정규 표현식 역슬래시()는 확장문자 (역슬래시 다음에 일반 문자가 오면 특수문자로 취급하고 역슬래시 다음에 특수문자가 오면 그 문자 자체를 의미)
\b단어의 경계

정규표현식 예시

// 숫자만
String regex = ^[0-9]*$;
// 영어만
String regex = ^[a-zA-Z]*$;
// 한글만
String regex = "^[ㄱ-ㅎ|ㅏ-ㅣ|가-힣\\s]*$";

정규 표현식 regex 자바 메서드

String 의 replaceAll(), matches() 메서드

        String regex = "^[ㄱ-ㅎ|ㅏ-ㅣ|가-힣\\s]*$";

        String code = " 안녕 하세요 ㅎㅎ ";
        // String reusltCode = code.trim();  // 앞,뒤 공백 제거
        // 공백 처리 \p{Z} 또는 \p{Separator}: 모든 종류의 공백 또는 보이지 않는 구분 기호.
        String reusltCode = code.replaceAll("\\p{Z}", "");

		// 각 글자가 한글 정규표현식에 부합하는지 확인
        if(reusltCode.matches(regex)){
//        if(Pattern.matches(regex, code)){
            System.out.println("true");
        } else {
            System.out.println("false");
        }

// 개인적으로 많이 사용하는 방식 
// matches(정규표현식) 메서드만 사용하면 되니까!
reusltCode.matches("^[ㄱ-ㅎ|ㅏ-ㅣ|가-힣\\s]*$");
  • matches 는 string에 사용할 수 있는 메소드이다.
  • *은 맨 앞에 올 수 없기 때문에 앞에 .을 써준다.
  • [ㄱ-ㅎ]는 ㄱ부터 ㅎ까지
  • [ㅏ-ㅣ]는 ㅏ부터 ㅣ까지
  • [가-힣]는 한글 자모음을 조합하여 만들어낼 수 있는 모든 한글을 의미
  • +는 한글이 하나 이상 반복됨을 의미
  • .*는 한 글자 또는 문자열

Pattern

Pattern이라는 클래스를 알 수 있다. 이 클래스는 꼭 알아두자. 자바에서 정규표현식을 사용할 때 많이 사용하는 클래스로, 패턴 매치로 matach(), complie() 메서드를 가지고 있다.

  • Pattern 의 matches() 메서드
String regex = "^[ㄱ-ㅎ|ㅏ-ㅣ|가-힣\\s]*$";

boolean checkHangle = Pattern.matches(regex, s);
  • Pattern 의 compile() 메서드
Pattern pattern = Pattern.compile("\\bcat\\b");
  • 활용예시
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class regex {
    static public void main(String[] args) {
        String REGEX = "([0-9]{2,3}-[0-9]{3,4}-[0-9]{4})";
        String INPUT1 = "010-1234-5678";
        String INPUT2 = "010-1234-5678로 연락주세요 ~";

        System.out.println(pattern.matches(REGEX, INPUT1));  // true
        System.out.println(pattern.matches(REGEX, INPUT2));  // false
    }
}

Matcher는 match operation을 수행하는 engine이다. Matcher는 다음과 같이 Pattern 객체로부터 생성된다. 인자로 패턴을 찾을 문자열을 전달한다.
// 아직까지 활용못함...

Pattern pattern = Pattern.compile("\\bcat\\b");
Matcher matcher = pattern.matcher("cat cat cat cattie cat");
  • 활용 예시
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class regex {
    static public void main(String[] args) {
        String REGEX = "([0-9]{2,3}-([0-9]{3,4}-[0-9]{4}))";
        String INPUT = "My number is 010-1234-5678. touch me.";

        Pattern pattern = Pattern.compile(REGEX);
        Matcher matcher = pattern.matcher(INPUT);

        if(matcher.find()) {
            System.out.println(matcher.group());  // 010-1234-5678
        }
    }
}
출처: https://gngsn.tistory.com/53 [ENFJ.dev:티스토리]


관련된 정리된 글 참조

profile
배운 것을 기록합니다.

0개의 댓글