정규 표현식: 텍스트에서 사용되는 강력한 도구

정규 표현식은 무엇인가?

정규 표현식은 텍스트 내에서 특정한 패턴을 검색하고 조작하기 위한 강력한 수단입니다. 이 글에서는 이러한 정규 표현식의 핵심을 파헤치고, 이미 존재하는 문자열 조작 기술과 어떻게 다른지 알아봅니다. 또한, 어떻게 정규 표현식이 다양한 언어에서 사용되며 어떤 용도로 활용되는지 살펴봅니다. 이를 통해 정규 표현식에 대한 깊은 이해를 도모할 수 있습니다.

Table of Contents

정규 표현식의 역할

정규 표현식은 주로 텍스트 내의 패턴을 찾고 식별하는 데 사용됩니다. 이를 통해 대량의 데이터를 빠르게 분석하고 원하는 정보를 추출하는 데 도움을 줍니다.

기존 문자열 조작과의 차이

문자열 조작은 이미 존재하는 데이터를 다루는 데 주로 활용됩니다. 하지만 정규 표현식은 특정한 패턴을 가진 데이터를 찾거나 조작하는 데 뛰어난 효율성을 보입니다. 성능 면에서는 문자열 조작과 비교해 일부 상황에서 느릴 수 있지만, 데이터 내의 특정 패턴을 스마트하게 추출하고 다룰 수 있는 점에서 큰 장점을 가집니다.

정규 표현식의 다양한 언어 지원

정규 표현식은 C#, Java, Pearl, Javascript, MySQL, Oracle과 같은 다양한 언어에서 지원됩니다. 각 언어마다 조금씩 다른 문법과 기능을 가지고 있으며, 특정한 용도에 따라 선택하여 사용할 수 있습니다.

정규식 요소들

Basic Syntax
/…/
시작 정규식 구분 기호
()
그룹화
|
교체
Groups and Range:
.
\n 제외한 모든 문자
(…)
캡처링 그룹
(a|b)
a 또는 b
(?:)
캡처되지 않는 그룹
[abc]
a,b 또는 c
[^abc]
a, b 또는 c 아님
[a-z]
a에서 z까지의 소문자
[A-Z]
A에서 Z까지의 대문자
[0-9]
0에서 9까지의 숫자
Quantifiers:
*
0 이상
+
하나 이상
?
0 또는 1
{2}
정확히 두개
{2,}
또는 그이상
{2,6}
2 6 사이 (2,3,4,5 또는 6)
String Replacement:
$+
마지막으로 일치하는 그룹
$&
전체 일치 그룹
`$“ 일치하는 그룹
$’
일치된 그룹
$1
번째 그룹
$n
n번째 그룹
Assertions:
?=
Lookahead Assertion
?<=
Lookbehind Assertion
?!
Negative Lookahead
?<! or ?!=
Negative Lookbehind
?>
번만 구독
?()
그렇다면
?()|
그렇지 않다면
?#
주석
POSIX
[:aplha:]
모든 문자
[:upper:]
대문자
[:lower]
소문자
[:alnum:]
숫자와 문자
[:digit:]
숫자
[:xdigit:]
16진수
[:punt]
문장 부호
[:word]
숫자 문자 밑줄
Position
^ 문자열//여러 줄의 시작
$
문자열//여러 줄의
\A
문자열의 시작
\Z
문자열의
\b
단어 경계
\B
단어 비경계
\<
단어의 시작
\>
단어의
Character:
\s
공백
\S
공백이 아닌
\w
단어
\W
단어가 아닌 문자
\d
숫자
\D
숫자가 아닌
\x
16진수
\0
8진수
[\b]
백스페이스 문자
Special Characters:
\f
현재 페이지를 마칩니다.
\n
바꿈
\r
캐리지 리턴
\t
\v
세로
\xaa
헥스 문자 aa
\0nn
8진수 문자 nn (7<=n<=<>)
Escape Sequences:
\Q
리터럴 시퀀스 시작
\E
리터럴 시퀀스 종료
\
특수문자 – \ {}^$.|*+?
Pattern Modifiers: Flags
g
글로벌 매치
s
모드는 바꿈을 포함하여 모두 일치합니다.
m
여러 모드(^ $ 줄의 시작과 끝과 일치)
E
교체 평가
i
대소문자 무시
U
욕심 없는 모드
x
구성요소 공백 허용
POSIX
[:blank:]
스페이스바
[:space:]
공백 문자
[:cntrl:]
제어 문자
[:graph:]
인쇄된 문자
[:print]
인쇄된 문자와 공백


정규식과 테스트 문자열의 일치

정규 표현식 이미지 모두, 슬래시 (/)와 (/g)는 이미 정규 표현식 앞뒤에 지정되어 있으며 필요에 따라 클릭하여 변경할 수 있습니다.

링크(https://regexr.com/) 를 사용하여 문자열을 정규 표현식으로 테스트했습니다.

/[abc]+/g : 대소문자를 구분하는 a, b, c 중 하나의 문자와 일치합니다.

정규 표현식: 텍스트에서 사용되는 강력한 도구

/[^abc]/g : a, b, c를 제외한 문자와 일치합니다.

정규 표현식: 텍스트에서 사용되는 강력한 도구

/[a-z]/g : a부터 z 사이의 모든 문자와 일치합니다.

정규 표현식: 텍스트에서 사용되는 강력한 도구

여기서 a-z는 대소문자를 구분합니다.

/[^a-z]/ : a부터 z까지의 범위에 포함되지 않는 문자와 일치합니다.

정규 표현식: 텍스트에서 사용되는 강력한 도구

a-z는 대소문자를 구분하는 범위 내의 단일 문자입니다.

/[a-zA-Z]+/g : a부터 z 또는 A부터 Z까지의 문자와 일치합니다.

정규 표현식: 텍스트에서 사용되는 강력한 도구

a-z, A-Z 결론은 모든 알파벳 입니다.

/.+/ : 모든 단일 문자와 일치합니다.

정규 표현식: 텍스트에서 사용되는 강력한 도구

.+ 는 줄 바꿈 문자를 제외한 모든 문자와 일치합니다.

. 는 줄 바꿈 이외의 문자 또는 /s 플래그가 있는 줄 바꿈을 포함하는 모든 문자와 일치합니다.

/\s/g : 모든 공백 문자와 일치합니다.

정규 표현식: 텍스트에서 사용되는 강력한 도구

공백을 요구하기 위해 [\s] 또는 \s를 사용합니다.

\s는 모든 공백문자로 [\r\n\t\f\v] 과 동일합니다.

/\d/g : 모든 숫자와 일치합니다.

정규 표현식: 텍스트에서 사용되는 강력한 도구

/\D+/g : 숫자가 아닌 모든 문자와 일치합니다.

정규 표현식: 텍스트에서 사용되는 강력한 도구

/\w+/g : 모든 단어 문자와 일치합니다.

정규 표현식: 텍스트에서 사용되는 강력한 도구

\w는 글자, 숫자 또는 밑줄과 일치합니다. [a-zA-Z0-9_]와 동일합니다.

/\W+/g : 모든 비 단어 문자와 일치합니다.

정규 표현식: 텍스트에서 사용되는 강력한 도구

(…) : 괄호로 둘러싼 모든 것을 캡처합니다.

정규 표현식: 텍스트에서 사용되는 강력한 도구

괄호 안의 모든 것을 캡처하지만 순서대로 되어야 합니다.

(a|b) : a 또는 b와 일치합니다.

정규 표현식: 텍스트에서 사용되는 강력한 도구

st? : st의 0회 또는 1회와 일치합니다.

정규 표현식: 텍스트에서 사용되는 강력한 도구

위의 구문을 해석해 보면 st중 s는 무조건 일치 해야 하며 t는 있어도 일치 없어도 일치

st* : st의 0회 이상을 찾습니다.

정규 표현식: 텍스트에서 사용되는 강력한 도구

여기서는 연속된 st를 찾는데 단 *는 0회 이상입니다. s는 고정이고 t 가 있거나 많거나, 즉 s, st, sttt 등이 해당 됩니다.

^\w+/ 여기서 ^는 문자열의 시작과 일치합니다.

정규 표현식: 텍스트에서 사용되는 강력한 도구

\w+$/ : 여기서 $는 문자열의 끝과 일치합니다.

정규 표현식: 텍스트에서 사용되는 강력한 도구

/o\b/g : 여기서 \b는 단어 경계입니다.

정규 표현식: 텍스트에서 사용되는 강력한 도구

예를 들어, 단어 ‘diseased’를 가져오면, d\b는 마지막 글자를 선택하고, \bd는 첫 번째 글자 d를 선택합니다.

/r\B/g : r\B는 비 단어 경계로, \b와 일치하지 않는 위치를 유지합니다.

정규 표현식: 텍스트에서 사용되는 강력한 도구

중요한 정규 표현식 예제

정규 표현식은 텍스트 데이터의 패턴을 찾거나 매칭하는 데 유용한 도구입니다. 특히, 데이터 검증이나 비밀번호 강도 체크 등 다양한 용도로 활용됩니다. 이 글에서는 몇 가지 중요한 정규 표현식을 살펴보겠습니다.

문자열에서 중복 매칭하기

문자열 내 중복을 찾기 위한 정규 표현식은 다음과 같습니다:

/(\b\w+\b)(?=.*\b\1\b)/

이 표현식은 문자열에서 중복되는 단어나 구를 찾아냅니다.

사용자 이름 매칭하기

사용자 이름에 대한 정규 표현식은 다음과 같습니다:

/^[a-z0-9_-]{3,16}$/

이 표현식은 사용자 이름의 유효성을 체크합니다. 소문자, 숫자, 하이픈, 밑줄을 조합하여 3자에서 16자까지 허용합니다.

비밀번호 강도 검사

비밀번호 강도를 체크하는데 사용되는 정규 표현식은 다음과 같습니다:

// 강함
/(?=(.*[0-9]))(?=.*[\!@#$%^&*()\\[\]{}\-_+=~`|:;"'<>,./?])(?=.*[a-z])(?=(.*[A-Z]))(?=(.*)).{8,}/

// 보통
/(?=(.*[0-9]))((?=.*[A-Za-z0-9])(?=.*[A-Z])(?=.*[a-z]))^.{8,}$/

이 표현식들은 각각 복잡한 비밀번호와 중간 수준의 비밀번호를 검증합니다.

이메일 주소 매칭

이메일 주소에 대한 정규 표현식은 다음과 같습니다:

/^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/

유효한 이메일 형식인지 확인하는 데 사용됩니다.

16진수 값 매칭

16진수 값을 확인하는 정규 표현식은 다음과 같습니다:

/^#?([a-f0-9]{6}|[a-f0-9]{3})$/

16진수 색상 코드를 찾아냅니다.

URL 매칭

URL 주소를 찾아내는 정규 표현식은 다음과 같습니다:

// HTTP, HTTPS 포함
/http(s) Protocol:/https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#()?&//=]*)/

// Optional Protocol
/(https?:\/\/)?(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/

이 표현식들은 URL 주소를 찾아내거나 일치 여부를 확인하는 데 사용됩니다.

IP 주소 매칭

IP 주소를 찾아내는 정규 표현식은 다음과 같습니다:

/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/

유효한 IP 주소인지 확인하는 데 사용됩니다.

HTML 태그 매칭

HTML 태그를 찾아내는 정규 표현식은 다음과 같습니다:

/^<([a-z]+)([^<]+)*(?:>(.*)<\/\1>|\s+\/>)$/

HTML 문서에서 태그를 추출하는 데 사용됩니다.

특정 단어를 포함하지 않는 텍스트 매칭

특정 단어를 포함하지 않는 텍스트를 찾는 정규 표현식은 다음과 같습니다:

/^(?!.*?hello).*$/

“hello”라는 단어를 포함하지 않는 텍스트를 찾습니다.

전화번호

전화번호 :

^\d{2,3}-\d{3,4}-\d{4}$ 

휴대전화번호 :

^01(?:0|1|[6-9])-(?:\d{3}|\d{4})-\d{4}$

이와 같이 다양한 용도로 활용되는 정규 표현식들을 알아보았습니다. 텍스트 분석이나 데이터 검증 등에 유용하게 활용할 수 있습니다.

결론

문자열에서 복잡한 패턴을 찾아야 하는 경우 정규식을 사용하십시오.
아주 쉽게 문제를 해결 할 수 있습니다.

도움이 되었기를 바랍니다!

Leave a Comment