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)
특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어이다. 정규표현식은 많은 텍스트 편집기와 프로그래밍 언어에서 문자열의 검색과 치환을 위해 지원하고 있다.
식별하고자 하는 문자열에는 기대하는 고유한 패턴이 있을 것이다. 이 패턴을 찾아야 한다.
예를 들어 이메일이라면 test@gmail.com
과 같이 구성되기를 기대할 것인데, 이 문자열에서 패턴을 찾아보자(실제 이메일과 다른 부분이 있을 수 있으니 참고만 하자).
_
)로 구성된다.@
가 포함된다.@
이후에는 알파벳이나 언더바로 구성된 도메인명이 포함된다.com
또는 net
으로 구성되어야 한다고 가정한다.패턴을 식별했다면 각 패턴에 대응할 수 있는 정규표현식을 작성하여 합친다.
_
)로 구성된다.[a-z_]+
: a~z(알파벳 소문자) 또는 언더바(_
)로 구성된 문자열이 1글자 이상이다.@
가 포함된다.@
: @가 필요하다.@
이후에는) 알파벳이나 언더바로 구성된 도메인명이 포함된다.(com
or net
)[a-z]+
a~z(알파벳 소문자)로 구성된 문자열이 1글자 이상이다.\.
: .이 필요하다..
은 정규표현식에서 사용되는 기호이기 때문에 문자로써 사용하려면 \
를 붙여야 한다.(com|net)
: com
또는 net
이어야 한다.이렇게 찾은 정규표현식을 전부 합치면 다음 문장이 완성된다.
[a-z_]+@[a-z]+\.(com|net)
작성한 정규표현식이 이메일을 성공적으로 인식하는 것을 확인할 수 있다.
정규표현식을 만들었다면 사용중인 언어에서 이를 사용할 수 있는 함수를 찾아 사용하면 된다. 다음은 각 언어별로 정규표현식을 사용하는 함수 예시이다.
// 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