https://school.programmers.co.kr/learn/courses/30/lessons/72410
위 문제를 풀면서 정규식으로 풀면 되겠다라는 건 생각할 수 있었지만, 정규식으로 표현할 수가 없어 검색을 하여 문제를 해결하였다. 이 참에 정규식에 대해서 자세히 알아보면 좋을 듯하여 글을 정리하여 보았다.
정규표현식은 다음과 같은 구성 요소로 이루어져 있습니다:
- 리터럴(Literal) 문자: 일반 문자들은 자신과 정확히 일치하는 문자를 찾습니다. 예를 들어, 'abc'라는 패턴은 'abc'라는 문자열과 일치합니다.
- 메타 문자(Meta characters): 특수 기능을 수행하기 위해 사용되는 특수 문자들입니다. 예를 들어, '.', '*', '+', '?', '^', '$', '(', ')', '[', ']', '{', '}', '|', '' 등이 있습니다.
- 문자 클래스(Character classes): 대괄호([]) 안에 문자를 나열하여, 그 중 한 문자와 일치하는 것을 찾습니다. 예를 들어, [abc]는 'a', 'b' 또는 'c' 중 하나와 일치합니다.
- 수량자(Quantifiers): 패턴이 몇 번 반복되어야 하는지를 지정하는데 사용됩니다. '*', '+', '?' 및 '{}'와 같은 메타 문자들이 수량자로 사용됩니다.
- 그룹화(Grouping): 소괄호(())를 사용하여 여러 문자 또는 패턴을 그룹화하고, 수량자를 적용하거나 그룹화된 내용을 참조하는데 사용됩니다.
- 기타 메타 문자들:
- '^': 문자열이나 행의 시작과 일치합니다.
- '$': 문자열이나 행의 끝과 일치합니다.
- '|': 대체(alternation)를 나타내며, 두 패턴 중 하나와 일치합니다.
- '.': 줄바꿈 문자를 제외한 모든 문자와 일치합니다.
- 탈출 문자(Escape character): 메타 문자 앞에 역슬래시()를 두어, 해당 메타 문자가 특수 기능을 수행하는 것이 아닌 문자 그대로 인식되게 합니다.
이러한 구성 요소들을 조합하여 복잡한 문자열 패턴을 만들 수 있습니다. 정규표현식을 사용하면 효율적으로 문자열 검색, 추출 및 조작 작업을 수행할 수 있습니다.
[^a-z0-9-_.] : 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.) 문자를 제외한 나머지 문자를 의미( 먼저 대괄호 안에 ^있는 경우에는 부정을 뜻하며 a-z,0-9,-,_,. 가 아닌 경우를 의미함)
\\.{2,}: \\.은 문자 그대로 점(.)을 나타내고 {2,}: 이 부분은 수량자로서 {}를 사용하며, 이전 요소가 최소 2번 이상 반복되어야 함을 나타냅니다. 또한 예를 들어 a* 인 경우 "", "a", "aa", "aaa" ... a가 0번이상 나올 수 있다는 걸 정규식으로 표현한 것이다.
- * : 0번 이상
- + : 1번 이상
- ? : 0번 or 1번
- {n} : 바로 앞의 요소가 정확히 n번 반복
- {n,} : 바로 앞의 요소가 최소 n번 이상 반복
- {n,m} : 바로 앞의 요소가 최소 n번 에서 최대 m번까지 반복
- a{3}: 'a' 문자가 정확히 3번 반복되는 문자열과 일치합니다. (예: 'aaa')
- a{2,}: 'a' 문자가 최소 2번 이상 반복되는 문자열과 일치합니다. (예: 'aa', 'aaa', 'aaaa' 등)
- a{2,4}: 'a' 문자가 최소 2번에서 최대 4번까지 반복되는 문자열과 일치합니다. (예: 'aa', 'aaa', 'aaaa')
^\\.|\\.$ : 시작과 끝이 .으로 끝나는 것을 의미 ^: 시작, $ : 끝
| : 여러가지 패턴 중 하나를 뜻한다. 쉬운 예로는 cat|dog -> cat or dog 을 의미
[a-zA-Z0-9._%+-]+@(?:[a-zA-Z0-9-]+\.)+(?:com|org|net|edu) 이 정규표현식은 'john.doe@example.com', 'jane_doe@example.org', 'jack@example.net' 등의 이메일 주소와 일치합니다
위 사이트에서 작성한 정규표현식을 테스트 및 검증하면 좋을 듯하다
'Java' 카테고리의 다른 글
[알고리즘] 04/06 알고리즘 공부 (0) | 2023.04.07 |
---|---|
[java] 프로그래머스 : 등굣길 (0) | 2023.04.04 |
[java] 프로그래머스 : 정수 삼각형 (0) | 2023.04.04 |
[java] 프로그래머스 : N으로 표현 (0) | 2023.04.04 |
[java] Stream() 정리하기 (0) | 2023.04.02 |