gbmin's Tech Notes

서버 구축 및 유지보수, 클라우드 컴퓨팅, 네트워크 보안, IT 분야 기술 노트. :)

Tech Notes/Script Language

정규표현식(Regular Expression) 정의와 개념

gbmin 2023. 7. 21. 10:41

정규표현식은 문자열 처리 도구로서, 실무에서 다양하게 활용된다. 정규표현식의 개념과 특징 적인 부분을 정리하고 사용 시 주의할 점, 효과적으로 활용할 수 있는 예제들을 정리하였다.


[목차]

1. 정규표현식(Regular Expression)이란?

   정의

   역사

2. 정규표현식의 특징

   패턴 매칭 기능

   언어 간 호환성

3. 정규표현식의 구성 요소

   메타문자 (Metacharacters)

   리터럴 (Literals)

   플래그 (Flags)

4. 정규표현식의 활용 방법

   검색과 치환 작업

   데이터 유효성 검사

5. 정규표현식의 주의점

   백트래킹과 성능 문제

   복잡성과 가독성

6. 참고사이트


1. 정규표현식(Regular Expression)이란?

정의

정규 표현식(Regular Expression)은 문자열의 패턴을 찾아내고, 그 패턴을 활용해 문자열을 검색, 분리, 대체하는 등의 작업을 수행하기 위한 일련의 문자들로 이루어진 코드이다. 예를 들면, 특정 문자가 반복되는 패턴, 이메일 주소와 같은 형식을 가지는 패턴 등을 찾아내는 데 활용될 수 있다. 정규표현식은 문자 그대로 해석하지 않고, 패턴의 규칙을 정의하는 데 사용되는 메타 문자들로 구성된다.

 

역사

정규 표현식의 개념은 1950년대부터 컴퓨터 과학에서 사용되기 시작했다. 실제로 1956년 스테판 클레니(Stephen Kleene)라는 수학자가 "정규 집합"의 개념을 소개하며 기반을 둔 것으로 알려져 있다. 1970년대에는 유닉스 환경에서 에디터인 ed를 위해 켄 톰슨이 정규 표현식을 구현하였고, 이후 수많은 프로그래밍 언어와 툴에서 정규 표현식의 개념이 활용된다.



2. 정규표현식의 특징

패턴 매칭 기능

정규 표현식은 패턴 매칭 기능을 가지고 있다. 간단한 것부터 시작하여, 매우 복잡한 패턴도 잡아낼 수 있는데, 숫자나 알파벳, 특수 문자 등 다양한 조합을 사용할 수 있으며, 이들의 반복이나 위치 등 다양한 조건을 부여할 수 있다. 또한, 그룹화 기능을 통해 특정 패턴이 반복되는 것을 찾거나, 다양한 조건을 하나로 묶는 것도 가능하다.

 

언어 간 호환성

또한 정규 표현식은 프로그래밍 언어에 상관없이 일관된 문법을 가지고 있어, 다양한 언어에서 동일하게 적용할수 있다. JavaScript, Python, Java, Perl 등 많은 프로그래밍 언어에서 지원되며, 각 언어마다 약간의 차이는 있지만 대체로 비슷한 문법을 공유하여 사용한다. 또한, 리눅스의 grep 명령어나 다양한 텍스트 에디터에서도 사용됩니다. 이런 호환성 덕분에 한 번 정규 표현식을 잘 익히면 다양한 환경에서 활용할 수 있으며 개발자나 엔지니어의 역량을 한 단계 업그레이드할 수 있게 해 준다.

 

3. 정규표현식의 구성 요소

메타문자 (Metacharacters)

메타문자는 패턴을 기술하는 데에 사용되며, 11개의 문자(\ . ^ $ * + ? { } [ ] ( ) |)가 메타문자로 사용된다. 일반적인 문자열과는 다른, 의미를 가진다.

메타문자 설명
\  이스케이프 문자. 메타문자가 가진 특별한 의미를 무시하고, 그대로의 문자로 해석.
. 어떤 한 문자를 의미한다. 줄 바꿈 문자를 제외한 모든 문자와 매칭.
^ 문자열이나 행의 시작을 의미.
$ 문자열이나 행의 끝을 의미.
* 앞의 문자가 0번 이상 반복되는 패턴을 의미.
+ 앞의 문자가 1번 이상 반복되는 패턴을 의미.
? 앞의 문자가 0번 또는 1번 있는 패턴을 의미.
{ } 앞의 문자의 반복 횟수를 지정, {n}은 n번 반복, {n,}은 n번 이상 반복, {n,m}은 n번 이상 m번 이하 반복을 의미.
[ ] 대괄호 사이의 문자 중 하나와 매칭을 의미.
( ) 그룹을 만들어 주는 역할, 그룹 안의 패턴을 대상으로 반복이나 조건을 적용할수 있음.
| OR 연산을 의미함. |로 구분된 패턴 중 하나를 만족하는 경우를 찾음.

 

리터럴 (Literals)

리터럴은 메타문자와 대비되는 개념으로 그 자체로 해석되는 문자나 숫자, 특수문자 등을 말한다. 예를 들어, 정규 표현식 /apple/에서 'apple'은 문자 그대로의 'apple'을 의미하는 리터럴이다. 또 다른 예로, 정규 표현식 /[abc]/에서 a, b, c는 모두 리터럴로, 'a' 또는 'b' 또는 'c' 중 어느 하나를 참조한다. 메타문자인 대괄호([]) 내부에서 사용되어, 'a' 또는 'b' 또는 'c' 중 어떤 문자 하나와 일치하는 패턴을 의미한다.
리터럴을 사용하면 메타문자를 이용한 복잡한 패턴 표현 없이도, 원하는 문자 또는 문자열을 직접 참조할 수 있어 편리하다. 하지만, 복잡한 패턴을 표현하거나 다양한 조건을 처리하기 위해서는 메타문자와 함께 사용하는 것이 필요하다.

플래그 (Flags)

플래그는 정규 표현식의 동작 방식을 변경하는 데 사용된다. 대표적인 플래그로는 대소문자를 구분하지 않는 i, 여러 줄에 걸친 검색을 가능하게 하는 m, 전역 검색을 가능하게 하는 g 등이 있다. 플래그는 정규 표현식의 끝에 위치하며, 예를 들어 /apple/ig에서 'ig'가 플래그다. 'apple'이라는 문자열을 대소문자를 구분하지 않고(i) 전체에서(g) 찾아낸다는 것을 의미한다.

플래그 설명
i 대소문자를 구분하지 않음, 예를 들어, /apple/i는 'apple', 'APPLE', 'Apple' 등을 모두 찾아낸다.
g 전역 검색(global)을 수행, 이 플래그 없이 정규 표현식을 사용하면 첫 번째 매칭 결과만 반환하지만, g 플래그를 사용하면 문자열 전체에서 패턴과 일치하는 모든 결과를 찾아냄.
m 여러 줄(multiline) 검색을 수행, 이 플래그를 사용하면, ^와 $ 메타문자는 문자열 전체가 아닌 각 줄의 시작과 끝을 나타냄.
s 단일 라인(dotall) 검색을 수행, 이 플래그를 사용하면, 메타문자는 줄 바꿈 문자를 포함한 모든 문자와 매칭.
u 유니코드(unicode) 패턴을 사용, 이 플래그를 사용하면, 정규 표현식은 유니코드 문자열에 대해 패턴을 처리함.
y 스티키(sticky) 검색을 수행, 이 플래그를 사용하면, 검색이 마지막으로 일치한 이후의 위치에서 계속됨.

 

 

4. 정규표현식의 활용 방법

검색과 치환 작업

정규 표현식은 주어진 문자열에서 특정 패턴을 검색하거나 치환하는 데 많이 사용된다. 특히 g 플래그를 사용하면 문자열 전체에서 패턴을 찾아낼 수 있다. 다음 정규 표현식은 문자열에서 모든 'apple'이라는 단어를 찾아내는 데 사용된다.

/apple/g


이를 활용해 다양한 프로그램에서 'apple'을 'orange'로 바꾸는 치환 작업을 수행할 수 있다.

 

javascript

let text = "I have two apples and one apple.";
let newText = text.replace(/apple/g, 'orange');
console.log(newText); // "I have two oranges and one orange."

 

vim

:%s/apple/orange/g

 

python (re 모듈활용)

import re
text = "I have two apples and one apple."
new_text = re.sub('apple', 'orange', text)
print(new_text) # "I have two oranges and one orange."

 

sed

echo "I have two apples and one apple." | sed 's/apple/orange/g'

 

perl

echo "I have two apples and one apple." | perl -pe 's/apple/orange/g'


데이터 유효성 검사

정규 표현식은 입력된 데이터가 특정 형식에 맞는지 검증하는 데도 널리 사용된다. 이메일 주소, 전화번호, 비밀번호 등 특정 패턴을 따르는 정보의 유효성을 검사할 많이 활용되고 있다. 예를 들어, 다음 정규 표현식은 이메일 주소의 유효성을 검사하는 데 의미는 아래와 같다.

/^[\w.-]+@\w+\.\w+$/;

^ : 문자열의 시작
[\w.-]+ : 알파벳, 숫자, 점(.), 대시(-) 중 하나 이상
@ : '@' 문자
\w+ : 알파벳이나 숫자 중 하나 이상
\. : '.' 문자
\w+ : 알파벳이나 숫자 중 하나 이상
$ : 문자열의 끝

이 정규 표현식은 문자열이 일반적인 이메일 주소 형식에 맞는지를 확인하는 데 사용될 수 있는데 javascript 를 예를 들면 이와 같은 방법으로 쓸 수 있다.

let email = "user.name@example.com";
let pattern = /^[\w.-]+@\w+\.\w+$/;

console.log(pattern.test(email)); // true

.test() 메서드는 주어진 문자열이 정규 표현식에 맞는지 검사하고, 그 결과를 true나 false로 반환하며, 이를 통해 입력받은 이메일 주소의 형식이 올바른지 확인할 수 있다.

이처럼 정규 표현식은 문자열 검색과 치환 테이터 유효성 검사등 자양한 작업을 간편하게 해 줄 수 있으며 수많은 프로그램에서 활용할 수 있기 때문에 익혀두면 매우 유용한 도구이다.

 

 

5. 정규표현식의 주의점

백트래킹과 성능 문제

정규표현식은 매우 유용한 도구지만, 잘못 사용하면 심각한 성능 문제를 일으킬 수 있다. 특히 '백트래킹'이라는 과정에서 성능 이슈가 발생할 수 있는데, 이는 정규표현식이 주어진 문자열을 검사하면서 가능한 매칭 패턴을 찾아나가다가, 매칭이 실패하면 이전 상태로 돌아가 다시 매칭을 시도하는 과정을 말한다.
이런 백트래킹이 많아지면 CPU 사용량이 늘어나고, 결국 성능 저하를 일으키게 된다. 이를 '재귀적 백트래킹'이라고 부르며, 특히 이런 현상이 발생하기 쉬운 패턴을 '재귀적 백트래킹'이 발생하는 패턴이라고 부른다 정규표현식을 작성할 때는 이런 재귀적 백트래킹이 발생하지 않도록 주의해야 한다.

 

복잡성과 가독성

정규표현식은 유용하게 쓸 수 있지만 복잡하고, 이해하기 어려울 수 있다. 특히 복잡한 패턴을 표현하려면 여러 메타문자와 플래그를 조합해야 하며, 코드가 복잡해진다면 가독성을 떨어뜨릴 수 있다.

정규표현식을 사용할 때 주의점.
필요 이상으로 복잡한 정규표현식을 사용하지 않는다. : 필요한 최소한의 패턴만을 표현하고, 불필요한 복잡한 내용을 최소화한다.
정규표현식에 주석을 달아 둔다. : 정규표현식이 복잡해질 경우, 해당 정규표현식이 어떤 패턴을 의미하는지 설명하는 주석을 추가하는 것이 좋다.
테스트를 진행한다. : 정규표현식이 의도한 대로 동작하는지 테스트를 통해 확인하는 것이 중요하다. 정규 표현식을 손쉽게 확인해 볼 수 있는 사이트가 있으니 간단히 확인이 가능하다.



6. 참고사이트

MDN Web Docs (정규표현식 가이드) : https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/Regular_Expressions

 

정규 표현식 - JavaScript | MDN

정규 표현식, 또는 정규식은 문자열에서 특정 문자 조합을 찾기 위한 패턴입니다. JavaScript에서는 정규 표현식도 객체로서, RegExp의 exec()와 test() 메서드를 사용할 수 있습니다. String의 match(), matchA

developer.mozilla.org

 

RegExr (정규표현식 테스트 사이트) : https://regexr.com/

 

RegExr: Learn, Build, & Test RegEx

RegExr is an online tool to learn, build, & test Regular Expressions (RegEx / RegExp).

regexr.com

 

LeetCode (정규표현식 연습문제) : https://leetcode.com/

 

LeetCode - The World's Leading Online Programming Learning Platform

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com