본문 바로가기
개발자 준비/JAVA

정규 표현식

by osul_world 2022. 11. 9.
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

 

자주 사용되는 정규식

  • 메타문자와 수량자를 파악해 해석해 보시길 바랍니다

 

정규식 연습하기

아래 페이지에서 정규식을 편리하게 연습해 볼 수 있습니다

https://regexr.com

 

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