★KEYWORD★
📢 패턴(pattern)으로 특정 목적을 위해 필요한 문자열의 집합을 지정하기 위해 쓰이는 식
정규 표현식(regexp / regex, rational expression)
특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어이다.
(❓ 형식언어: 수학, 컴퓨터 과학, 언어학에서 쓰는 말, 특정한 법칙들에 따라 적절하게 구성된 문자열들의 집합)
주로 Prograaming Language나 Text Editor등에서 문자열의 검색과 치환을 위한 용도로 쓰이고 있다.
메타문자
. ^ $ * + ? {} [] \ | ()
- 메타문자는 문자를 설명하기 위한 문자로, 문자의 구성을 설명하기 위해 원래의 의미가 아닌 다른 의미로 쓰이는 문자를 말함
- 정규 표현식에서는 위와 같은 메타문자를 사용함
정규표현식 : [ ]
문자 클래스인 [ ]
는 "[ ] 사이의 문자들과 매치"
라는 의미를 가지며, [ ]
사이에는 어떤 문자도 들어갈 수 있다.
- [abc]라면 이 표현식의 의미는 "a, b, c 중 한 개의 문자와 매치" 를 뜻한다.
- Ex)
[abc]
가"a", "before", "dude"
와 어떻게 매치되는지 살펴보자a
는 정규식과 이리하는 문자인a
가 있으므로 매치before
은 정규식과 일치하는 문자인b
가 있으므로 매치dude
는 정규식과 일치하는 문자인a, b, c
중 어느 하나도 포함하고 있지 않으므로 매치되지 않음
정규표현식 : 하이픈( - ), 캐럿( ^ )
하이픈( - ) 은 두 문자 사이의 범위(from - to)를 의미, 캐럿(^)은 반대를 의미한다.
[a-zA-Z]
: 알파벳 모두 매치[0-9]
: 숫자 매치[^0-9]
: 숫자가 아닌 문자만 매치[ ]
안에서는 부정의 의미로 사용[ ]
가 없으면 문자열의 처음을 뜻함 (끝은 $로 표시)
- 문자클래스
[ ]
안에는 어떤 문자나 메타 문자도 사용할 수 있지만^
는 반대(not)의 의미로 사용되기 때문에 조심해야 한다.
정규표현식 : \ 역슬래쉬
[0-9]
또는 [a-zA-Z]
와 같은 정규표현식은 \역슬래쉬를 이용해 간단하게 표현할 수 있다.
\d
- 숫자와 매치,[0-9]
와 동일한 표현식이다.\D
- 숫자가 아닌 것과 매치,[^0-9]
와 동일한 표현식이다.\s
- whitespace 문자와 매치,[ \t\n\r\f\v]
와 동일한 표현식이다.\S
- whitespace 문자와 매치,[^\t\n\r\f\v]
와 동일한 표현식이다.\w
- 문자 + 숫자(aplhanumeric)와 매치,[a-zA-Z0-9_]
와 동일한 표현식이다.\W
- 문자 + 숫자(aplhanumeric)와 매치,[^a-zA-Z0-9_]
와 동일한 표현식이다.\s
- 스페이스(공백문자), 탭과 매치,[\t\n\f\r]
과 동일한 표현식이다.\S
- 스페이스 외 문자와 매치,[^\t\n\f\r]
과 동일한 표현식이다.
대문자로 사용된 것은 소문자의 반대임을 추측할 수 있다.
또한 정규식 상의 특별한 의미가 있는 문자들을 문자 그대로 쓸 때 앞에 붙여 사용된다.
정규표현식 : 'Dot(.)'
줄바꿈 문자인 \n
을 제외한 모든 문자와 매치됨을 의미한다.
a.b
위 정규식의 의미는 "a + 모든문자 + b"
와 같다.
- 즉 a와 b라는 문자 사이에 어떤 문자가 들어가도 모두 매치가 된다는 의미이다.
- ex)
"aab", "a0b", "abc"
aab
는 가운데 문자a
가 모든 문자를 의미하는.
과 일치하므로 정규식과 매치된다.a0b
도 동일하게 가운데 문자0
이 모든 문자를 의미하는.
과 일치하므로 정규식과 매치된다.abc
는a
와b
사이에 어떤 문자가 존재하지 않기 때문에 위 정규식과 매치되지 않는다.
- ex)
a[.]b
문자 클래스[ ]
는 내부에 메타문자가 들어가더라도 문자 그대로 인식해주는 특징을 갖고 있다. 따라서 a.b
와 매치되고 a0b
와 같은 문자열은 매치되지 않는다.
정규표현식: 반복 관련 메타 문자 * + ? { }
반복 (*)
- 메타 문자
*
은*
바로 앞에 있는 문자가 0부터 무한대로 반복될 수 있다는 의미이다.
ca*t
- 위 정규식은
c + a(0번 이상 반복) + t
라는 것을 알 수 있다.ct
,cat
,caaat
모두 매치된다.
반복(+)
- 반복을 나타내는 또 다른 문자인
+
입니다.+
는*
과 달리 최소 1번 이상 반복될 때 사용한다. 즉*
은 반복횟수가 0부터 시작,+
는 반복횟수가 1부터 시작된다. ct
,cat
,caaat
중ct
는 매치되지 않는다.
반복({m,n})
{ }
는 원하는 반복횟수를 지정하고 싶을 때 사용된다. m에서 n까지 반복, m이상인 경우, n이하인 경우 등 자유롭게 원하는 만큼 조절이 가능하다.{m}
: 반드시 m번 반복ca{2}t
: "c + a(반드시 2번 반복) + t"
{m, n}
: m~n회 반복ca{2, 5}t
: "c + a(2~5회 반복) + t"
{m,}, {,n}
: m회 이상 반복, n회 이하 반복
반복(?)
?
는 반복은 아니지만 비슷한 개념으로{0, 1}
과 같은 의미를 지닌다. 즉, 문자가 있거나 없거나 둘 다 매치 되는 경우이다.ab?c
: "a + b(있어도 되고 없어도 된다) + c"
*
, +
, ?
메타 문자는 모두 {m, n}
형태로 고쳐 쓰는 것이 가능하지만 가급적 이해하기 쉽고 간결한 *
, +
, ?
메타 문자를 사용하는 것이 좋다.
✏️ Ex) 주민등록번호 정규표현식
/^\d{2}[0-1]\d{1}[0-3]\d{1}\-[1-4]\d{6}$/
^
: Start of String
\d{3}
: 1-2번째(년도) 숫자 0-9
[0-1]
: 3번째(월도 앞자리) 0,1
\d{1}
: 4번째(월도 뒷자리) 숫자 0-9
[0-3]
: 5번째(일자 앞자리) 0,1,2,3
\d{1}
: 6번째(일자 뒷자리) 숫자 0-9
\ -
: 7번째(구분자) -
[1-4]
: 8번째(성별) 90년대생, 1,2 2000년대생 3,4
\d{6}
: 9-14번째(뒷자리 6자리) 숫자 0-9
$
: End of String
출처 및 참고 : 위키백과, https://sooftware.io/regex/
HyunZzang의 프로그래밍 공간 / 함께 공부해요!!
도움이 되셨다면 "좋아요❤️" 또는 "구독👍🏻" 부탁드립니다 :)