칭찬받은 정규표현식
공부해보자구~
✨정규표현식이란
- 편집기의 패턴매칭을 위해 탄생한 문자열 패턴 매칭기
- 특정패턴을 이용해 문자열을 찾을 수 있게 표현한 것입니다.
"정규표현식이란, 특정 문자열을 찿기위한 패턴을 기록한 것" 으로 이해할 수 있을 것 같습니다.
그럼 이제 패턴을 표현하는 방법? 패턴을 작성하는 방법에 대해 알아봅시다
💡 정규표현식의 표현 방식
- 아래의 순서로 정규표현식을 표현합니다
정규표현식(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
'Java > 클린 코딩 (with OOP)' 카테고리의 다른 글
5. JAVA 기본 타입 vs 참조 타입 (with 래퍼클래스를 사용해야할 때) ➡️ Integer(Wrapper Class) 보다 int(기본 타입) (0) | 2022.06.14 |
---|---|
2. 주석 사용 지양해야하는 이유 - 클린 코드 4장 (0) | 2022.06.07 |
1. 자바 네이밍 규칙 (java 네이밍 컨벤션) (5) | 2022.06.02 |
0. Google style convention 적용하기 (0) | 2022.06.01 |
[JAVA] 자바 클린 코딩 하기 - 객체지향이기위해 지켜야하는 것들 (0) | 2022.06.01 |