regex 관련 Deeper Dive [Java 로 이해하기]

7과11사이·2023년 12월 1일
0
post-custom-banner

이력서를 작성하는 과정에서 이전에 했던 프로젝트를 다시 한번 보게됐다.
그 과정에서 사실 "생각보다 깊게 공부를 한 내용이 없었던게 아닐까?" 라는 생각을 하게 됐다.

이전에는 내가 관심있는 부분과 공부를 꾸준히 하기 위해 벨로그를 사용했지만
그저 열심히만 강조될 뿐, 얼만큼 깊게 파는지를 보여주지 못한 것 같다.

따라서 다시 한번 공부한 내용들을 보강하며 차근 차근 깊게 들어가는 과정을 밟고자 한다!
Swift Regex부터 시작이다.


Regex Recap 🎯 공식문서

Regex는 이전 블로그 내용에 정리를 한대로 정규 표현식이다. 공식문서에서는 패턴을 짧게 표현/설명하는 방법이라고 서술되어 있다. 이는 String의 패턴을 분석하는 툴인데, 특정 값이나 데이터를 탐색하거나 추출할 수 있도록 도우며 해당 실력은 개발자에게 중요한 능력이라고 한다!
이 때 정규표현식이 유용하게 사용이 되는 기술이라는 점!

How Regex Works

유튜브를 통해 조금 이해하게 됐는데, JavaScript에서 사용되는 정규 표현식을 활용했지만 - 비슷한 구조를 가지고 있었다.

1. Flag

Flag는 찾고자하는 표현의 범주를 의미하는 것으로 이해했다.

1. 예를 들어, 아래 단어에서 n을 찾고자 한다. [Flag 설정 X]

banana
→ 3번에 위치한 n만 탐색


2. 동일하게 n을 찾고자 한다., 'Global'Flag 설정

banana
→ 3,5번에 위치한 n을 탐색


3. 다른 Flag는 insensitive이다.
banana를 검색 키워드로 두고 InsensitiveFlag 설정할 경우

banana, Banana
→ 두 표현 모두 regex에 의해 검색이 된다.
banana를 검색했지만 대문자를 사용한 Banana가 검색에 걸리는 이유는 Case insensitive Flag를 사용했기 때문.

Swift에서는 Flag가 존재하지 않는 것으로 알고 있지만, 대략적인 정규 표현식의 작동 방법을 이해하게 됐다.

[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,64}

위 regex는 입력받는 값에서 특정 표현이 사용되는지 확인하는 구조이다.
"@" 앞의 정규 표현식을 참고해보자면 아래와 같이 이해할 수 있다.
입력받는 값이 소/대문자인지, 숫자 범주와 함께 특수 문자가 들어가는지를 검사하는 정규 표현식인 셈이다.

2. Sets

자세히 보면 정규 표현식은 대괄호 안에 키워드들이 담겨 있다.
해당 대괄호는 범주를 의미하는데, 탐색하고자 하는 키워드의 범주를 의미한다!

위 사용된 예시를 그대로 사용해보자.

[A-Z0-9a-z._%+-]

위 표현은 앞서 이야기한대로 범주를 의미한다.
여기서 A-Z는 대문자 알파벳, 0-90부터 9, a-z는 소문자를 탐색하는 것이다.
따라서 해당 대괄호는 소문자, 대문자 영문, 숫자 0~9가 들어갔는지를 확인하는 것이다.
특수표현 또한 _,%,+,-가 사용되는지를 확인하는데, 이메일의 앞단을 꾸미는데 사용이 되었는지를 확인하는 것이다.

여기서 특징은 대괄호 밖에서 특정 키워드를 넣을 경우 해당 표현은 무조건 있어야 한다는 점이다.

뒤에 바로 이어지는 "+@"를 예시를 들 수 있다.

[A-Z0-9a-z._%+-]+@만 검사해본다고 하자.
그렇다면 abc001@은 유효성 검사에서 통과가 되지만,
abc001은 유효성 검사에서 통과되지 못한다.

앞서 작성하내돌 "대괄호 밖에 존재하는 @"는 데이터에 포함여부를 확인하는 것이 아니라 무조건 존재해야 하기에 유효성 검사를 통과하지 못한다.

3. Excluding

그동안 대괄호 안에 값을 넣으면 일치 여부를 판단한다고 했다.
이를 반대로 적용하는 방법이 있는데, 아래처럼 ^ 표시를 사용하면 된다.

[^Exclude]

위 방식에 따르면 E,x,c,l,u,d,e를 제외한 모든 값을 탐색할 것이다.
Swift에서 종종 사용하는 '!'와 같은 역할을 한다고 볼 수 있겠다.

참고 링크

post-custom-banner

0개의 댓글