728x90
replaceAll() 을 이용해 문자열 치환에서 활용되거나 Pattern.matches() 를 이용해서 검증에서 활용되는 등
문자열의 형식을 추려내야하는 작업을 간단하게 수행할 수 있습니다
하지만, 정규식은 가독성이 좋지 않습니다.
때문에 클린 코드를 위해 정규식을 사용할때는 고민이 필요합니다 가독성이 필요한 부분은 직접 조건문을 작성함이 어떨까 싶습니다
수량자와 메타문자
정규식에서 패턴을 이루는 요인은 두개로 나뉠 수 있습니다
- 메타문자 : 문자를 자체를 나타내는 문자
- 수량자 : 앞에 기입한 문자가 몇개 존재해야 하는지 수량을 나타내는 문자
아래 활용 예시를 보면 어떤 의미인지 이해하실 겁니다
메타문자 종류
^ : 문자열의 시작
$ : 문자열의 종료
. : 모든 종류의 한 문자
[]: 문자 클래스
^ : 문자 클래스 내에서 ^는 not
- : 범위를 의미한다.
| : or를 나타냄
() : 하나의 문자로 묶어준다.
\\\\s : 공백문자
\\\\b : 문자와 공백 사이를 의미한다.
\\\\d : 숫자를 의미한다.
\\\\t : 탭문자
\\\\w : 단어 영문자+숫자+_(밑줄)
수량자 종류
? : 앞 문자가 없거나 하나 있음
+ : 앞 문자가 1개 이상임
* : 앞 문자가 0개 이상임
{n,m} : 앞 문자가 n개 이상 m개 이하
{n,} : 앞 문자가 n개 이상
{n} : 앞 문자가 정확히 n개
정규 표현식 예시
잠깐! 정규 표현식은 일반적인 문자도 추출할 수 있습니다
- 단, 특수문자를 추출하려면 \\를 사용한다
if(Pattern.matches("hi\\\\-", "hi-")) //true
boolean Pattern.matches()로 문자열의 양식을 검증할 때 활용하기
- ^$ 를 사용한다
if(Pattern.matches("^[0-9]{2,8}$", "122323")) //문자열이 2이상 8 미만의 숫자로 이루어져 있는가?
if(Pattern.matches("\\\\d{2,8}$", "122323"))
if(Pattern.matches("^[012]{2,8}$", "122")) //2이상 8미안의 0또는 1,2 중에 수로 이루어져 있는가?
String replaceAll()로 문자열을 치환할 때 활용하기
- ^$를 사용하지 않는다
- +*?등을 사용해되 되지만 간단하게 {a,b}로 표현하면 편하다
"aacb".replaceAll("[ab]", "")) //c: a또는 b를 ""로 치환
"aacb".replaceAll("a+|b+", "") //c: 한개 이상의 a 또는 b로 연속된 부분을 ""로 치환
"aacb".replaceAll("ac?", "") //b: a혹은 ac를 ""로 치환
"aacb".replaceAll("[ab]{0,3}", "")) //c
자주 사용되는 정규식
- 메타문자와 수량자를 파악해 해석해 보시길 바랍니다
정규식 연습하기
아래 페이지에서 정규식을 편리하게 연습해 볼 수 있습니다
RegExr: Learn, Build, & Test RegEx
RegExr is an online tool to learn, build, & test Regular Expressions (RegEx / RegExp).
regexr.com
Reference
https://github.com/dream-ellie/regex
GitHub - dream-ellie/regex
Contribute to dream-ellie/regex development by creating an account on GitHub.
github.com
https://www.youtube.com/watch?v=t3M6toIflyQ
728x90
'개발자 준비 > JAVA' 카테고리의 다른 글
[JAVA 더 깊게] 자바의 해쉬(feat. equals 재정의) (0) | 2022.03.23 |
---|---|
오토박싱 & 언박싱 (0) | 2022.03.07 |
[JAVA 더 깊게] Stream(feat. 함수형 인터페이스 & Comparator) (0) | 2022.03.07 |
[JAVA 더 깊게] 자바의 정렬기준 Comparator & Comparable (feat. 함수형 인터페이스) (0) | 2022.03.04 |
JVM 메모리 구조 (0) | 2022.03.04 |