정규표현식

송선권·2024년 10월 18일
3

개발 지식

목록 보기
1/3
post-thumbnail

배경

km/h를 표현하는 형태는 다양하다.

km/h
km/hr
km/hour
kilometers/hour
kilometers per hour

특정 문장이 주어질 때, 여기에 km/h라는 뜻의 부분 문자열이 존재하는지 찾으려면 어떻게 해야할까?

String s = "5 kilometers per hour";
s.contains("km/h");
s.contains("km/hr");
s.contains("km/hour");
s.contains("kilometers/hour");
s.contains("kilometers per hour");

직관적으로 생각해보면 위처럼 다섯 문장을 실행해서 찾을 수 있겠지만 조금 복잡해보인다. 좀 더 간결하게 만들 수는 없을까?

이번에는 정규표현식이라는 걸 한 번 적용해보자.

모든 케이스를 성공적으로 잡아내는 모습

String s = "5 kilometers per hour";
s.matches('k(ilo)?m(eters)?(/|\sper\s)h(r|our)?');

정규표현식을 사용하니 코드가 굉장히 간결해졌다.

개념

정규표현식은 문자열 패턴을 정의하는 문자열이다. 텍스트 형태를 검증하거나 특정 부분 문자열을 추출하고자 할 때 주로 사용한다. 정규표현식을 잘 사용할 줄 알면 앞의 예시처럼 하나의 표현식만으로도 복잡한 형태를 간결하게 검증할 수 있다.

정규표현식(regexp, regular expression)
특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어이다. 정규표현식은 많은 텍스트 편집기와 프로그래밍 언어에서 문자열의 검색과 치환을 위해 지원하고 있다.

위키백과 - 정규표현식

작성 방법

1. 문자열에서 고유 패턴 식별

식별하고자 하는 문자열에는 기대하는 고유한 패턴이 있을 것이다. 이 패턴을 찾아야 한다.

예를 들어 이메일이라면 test@gmail.com과 같이 구성되기를 기대할 것인데, 이 문자열에서 패턴을 찾아보자(실제 이메일과 다른 부분이 있을 수 있으니 참고만 하자).

  • 이메일의 앞부분은 알파벳이나 언더바(_)로 구성된다.
  • 이메일의 가운데에는 @가 포함된다.
  • @ 이후에는 알파벳이나 언더바로 구성된 도메인명이 포함된다.
    • 여기서는 도메인 끝이 com 또는 net으로 구성되어야 한다고 가정한다.

2. 정규표현식으로 개별 패턴 표현

패턴을 식별했다면 각 패턴에 대응할 수 있는 정규표현식을 작성하여 합친다.

  • (이메일의 앞부분은) 알파벳이나 언더바(_)로 구성된다.
    • [a-z_]+: a~z(알파벳 소문자) 또는 언더바(_)로 구성된 문자열이 1글자 이상이다.
  • (이메일의 가운데에는) @가 포함된다.
    • @: @가 필요하다.
  • (@ 이후에는) 알파벳이나 언더바로 구성된 도메인명이 포함된다.(com or net)
    • [a-z]+ a~z(알파벳 소문자)로 구성된 문자열이 1글자 이상이다.
    • \.: .이 필요하다.
      • .은 정규표현식에서 사용되는 기호이기 때문에 문자로써 사용하려면 \를 붙여야 한다.
    • (com|net): com 또는 net이어야 한다.

이렇게 찾은 정규표현식을 전부 합치면 다음 문장이 완성된다.

[a-z_]+@[a-z]+\.(com|net)

작성한 정규표현식이 이메일을 성공적으로 인식하는 것을 확인할 수 있다.

3. 적합한 검색 함수 호출

정규표현식을 만들었다면 사용중인 언어에서 이를 사용할 수 있는 함수를 찾아 사용하면 된다. 다음은 각 언어별로 정규표현식을 사용하는 함수 예시이다.

// Java
"text".matches("regex");
Pattern.compile("regex").matcher("text");
// JavaScript
"text".match("regex");
# Python
import re
re.search("regex", "text");
// C#
Regex.Match("text", "regex");

정규표현식을 사용할 때는 고유 패턴을 정규표현식으로 바꿔 표현하는 것이 제일 어렵다. 정규표현식 문법이 굉장히 낯설게 느껴질텐데 결국 꾸준히 사용해보며 연습하는 수밖에 없다.

정규표현식을 어떻게 공부할 수 있을지 고민해보다가 접한 내용들을 간단하게 기록해두려고 한다. 이 글을 읽는 다른 사람들에게도 도움이 되었으면 좋겠다.

문법 익히기

정규표현식을 사용하려면 문법을 먼저 알아야 한다. 문법은 인터넷을 찾아보면 잘 정리되어있는 글이 많다. 열심히 찾아보고 문법을 익히기 위해 노력하자.

개인적으로 잘 정리되어있다고 느낀 글을 가져왔으니 참고하자.

📚 JavaScript 정규 표현식 문법 총정리 + 응용 예제
정규표현식 기초 - maxidea1024

실습해보기

외우는 것도 중요하지만 직접 쳐보면서 익히는 것도 중요하다. 인터넷에 다양한 실습 사이트가 있으니 직접 배운 문법을 사용해보자.
RegExr: Learn, Build, & Test RegEx

실습이 중요하다고는 하지만 뭐부터 해야할지 막막하다면 추천해주고 싶은 사이트가 있다. RegexOne은 vimtutor처럼 여러 Lesson들로 이루어져 각 문법이 어떤 역할을 하는지 설명해주고 간단한 퀴즈를 풀어보도록 유도한다. 문제를 풀듯이 정규표현식을 직접 쳐보며 익히는 과정이 나름 재미있었다.
RegexOne - Learn Regular Expressions with simple, interactive exercises

참고 자료

정규 표현식 - MATLAB & Simulink
정규 표현식 - 위키백과
📚 JavaScript 정규 표현식 문법 총정리 + 응용 예제
정규표현식 기초 - maxidea1024
RegExr: Learn, Build, & Test RegEx
RegexOne - Learn Regular Expressions with simple, interactive exercises

post-custom-banner

0개의 댓글