Java/클린 코딩 (with OOP)

4. 정규표현식이란, java 정규식 구성 및 가이드 + [JAVA에서 성능 높이기]

민돌v 2022. 6. 11. 17:22

칭찬받은 정규표현식

공부해보자구~

OMG

 

✨정규표현식이란

 - 편집기의 패턴매칭을 위해 탄생한 문자열 패턴 매칭기

- 특정패턴을 이용해 문자열을 찾을 수 있게 표현한 것입니다.

 

"정규표현식이란, 특정 문자열을 찿기위한 패턴을 기록한 것" 으로 이해할 수 있을 것 같습니다.

그럼 이제 패턴을 표현하는 방법? 패턴을 작성하는 방법에 대해 알아봅시다


💡 정규표현식의 표현 방식

  • 아래의 순서로 정규표현식을 표현합니다

정규표현식(regex) = 패턴구분자 시작 + 작상할 패턴 + 패턴구분자 끝 + 패턴 변경자 (ex /패턴/ g)


 

👏🏻 정규표현식의 표현방법 [메타문자 - 수량자]

  • 굉장히 많지만, 메타문자와 수량자에 대해서만 이야기 해보자

 

💡 메타문자 (Meta Character - 문자를 나타내는 문자)

  • 정규표현식을 제어하는 문자들입니다.
  • 원래 문자의 의미가 아닌, 다른 의미로 사용되는 문자들  (ex - . ^ $ * + ? { } [ ] \ | ( ))
  • 정규표현식에 메타문자를 이용하면 특별한 의미를 가집니다.
메타 문자 의미 및 기능
. 1. 모든 문자를 가르킴
ex) [a.b] : a + "모든문자"+ b 와 매칭되는 문자열 

2. [.] 은 . 그대로를 의미
ex) [a[.]b] : a.b 를 찾겠다

[ ]  - 문자클래스라고함

- 대괄호 안에 들어가는 문자를 찾음

- [] 안의 문자들과 매치 
- 문자클래스 안에서는 범위를 나타냄
ex) [0-9] : 0~9까지 찾겠다
      [0-9a-zA-Z] : 0~9까지 + 영,대문자 알파펫을 a~z까지 찾겠다
^ - 문자열의 처음을 의미

- 대괄호 안에서 ^ 는 (Not)을 의미 

| "or" 를 의미

자주 사용하는 문자 클래스

  • 문자 클래스 내부에 사용되면, 아래와 같은 의미를 가지는 문자들입니다.
- \d : 숫자와 매치, [0-9]와 동일한 표현식이다. 
- \D : 숫자가 아닌 것과 매치, [^0-9]와 동일한 표현식이다.
- \s : whitespace 문자와 매치, [ \t\n\r\f\v]와 동일한 표현식이다. 맨 앞의 빈 칸은 공백문자(space)를 의미한다. 
- \S : whitespace 문자가 아닌 것과 매치, [^ \t\n\r\f\v]와 동일한 표현식이다.
- \w : 문자+숫자(alphanumeric)와 매치, [a-zA-Z0-9_]와 동일한 표현식이다.
- \W : 문자+숫자(alphanumberic)가 아닌 문자와 매치, [^a-zA-Z0-9_]와 동일한 표현식이다. 

 


💡 수량자 (앞문자의 개수를 나타냄)

 찾을려는 문자의 수량을 나타낼 때 사용합니다

메타 문자 의미 및 기능
{ } 수량자를 나타냄
? 1. 앞 문자가 없거나 하나 있어야함을 의미

{0,1} 과 같음

2. 혹은 Lazy의미 : 가장 첫 번째 패턴을 찾는다.

ex) String : ", dd, afag, daf, dagah, df," 에 정규표현식을 적용하는  경우
 
 👉 /,.*,/g : ", dd, afag, daf, dagah, df,"
 👉 /,.*?,/g : ", dd," ", daf," ", df," : 한 턴씩 쉬면서 가장 첫번째 매칭되는 문자를 찾음

* 앞 문자가 0개 이상이어야함을 의미
{0, } 과 같음
+ 앞 문자가 1번 이상 발생햐애함을 의미
{1, } 과 같음
{n, m} 앞 문자가 n개 이상, m개 이하 있어함을 의미
{3, 6} : 3개이상 6개 이하 사이의 문자가 존재할 때
{n, } 앞 문자가 n개 이상임을 의미합니다.
{n} 앞 문자가 n개 이여야함을 의미합니다.

 

 

👏🏻 JAVA에서 정규표현식을 효과적으로 사용하기

 

String 클래스의 replaceAll() 메소드는 Patern.Complile을 사용

 

Pattern 의 Compile 메소드를 보면, 정적 팩토리 매소드로 매번 new 로 새로운 정규표현식 객체를 반환합니다.

 

하지만, 정규표현식은 바뀔일이 거의 없기 때문에, 매번 새로운 객체를 생성하는 것은 메모리 낭비입니다.

Pattern Matcher를 정적으로 빼서 사용하면 조금더 성능상의 이점을 가져갈 수 있다고 합니다 ^^

 


private static final Pattern REMOVE_NUMBER  = Pattern.compile("[^a-zA-Z]");

public static final String regex(String input){
    return REMOVE_NUMBER.matcher(input).replaceAll("");
}

-> 대충 작성한 요런식으로

 

 

 

굿!

 

참고

정규표현식 메타문자 : https://velog.io/@devxyoon/%EC%A0%95%EA%B7%9C-%ED%91%9C%ED%98%84%EC%8B%9D

우테코 테크톡 : https://www.youtube.com/watch?v=CjoDIgDOHA4