본문 바로가기
DevTools

정규 표현식 (Regular Expression)

by llHoYall 2021. 3. 6.

개인적으로는 개발을 하면서 매일같이 정규표현식을 사용하고 있습니다.

주위 동료나 후배들에게도 배워둘 것을 권하고요.

 

가장 많이 사용하는 것을 역시 검색 혹은 치환을 할 때입니다.

가장 자주 사용하는 VS Code 툴도 정규표현식으로 검색을 지원하고 있고, vim이나 기타 Linux 상에서 검색 등에서도 자주 사용을 하죠.

또, crawling 혹은 scraping 등을 할 때도 자주 사용되니 꼭 익혀두시길 권합니다.

 

정규표현식의 공식적인 표준은 없는 것으로 알고 있습니다.

가장 널리 사용되는 것은 PCRE이지만, 각각의 툴, 언어 등에 따라 약간씩 차이가 있을 수 있습니다.

기본적인 내용은 거의 공통적으로 사용되니 하나만 배워 두시면 쉽게 다른 곳에서도 적응해서 사용하실 수 있습니다.

Syntax

그러면 기본 개념과 문법부터 하나씩 살펴보도록 합시다.

 

  • 정규표현식은 대소문자 구분을 합니다.
  • 공백 문자를 포함하여 각각의 문자는 의미가 있습니다.
  • 일부 문자는 특별한 의미가 있습니다. 이는 뒤에서 따로 다루겠습니다.

그럼 이제 특별한 의미가 있는 문자들을 알아봅시다.

 

  • / : Slash는 이 사이에 있는 것들이 정규 표현식임을 알려주는 역할을 합니다. 안써도 되는 경우도 많으니 요령껏 하시면 되요.
    • /pattern/option : 주로 이런 식으로 사용하게 되요.
    • option도 마찬가지로 적용이 되는 툴과 안되는 툴, 별도의 방법을 써야하는 툴 들이 있어서 요령껏 하시면 되요. 
    • 보통 g로 전체 영역을 대상으로 할것이냐, 처음 만나는 것만 대상으로 할거냐, m으로 multiline에 pattern을 적용할거냐 이런 option들이 쓰여요.
  • ^ : 시작의 의미입니다. 즉 이 이후에 나오는 문자로 시작을 하는 pattern만 적용됩니다.
  • $ : 종료의 의미입니다. 즉 이 앞에 있는 문자로 끝나는 pattern만 적용됩니다.
  • \ : 특별한 의미 없이 문자 자체를 나타내고 싶을 땐, backslash로 escape 처리를 해줘야 합니다.
    • 예를 들어, \$라고 하면 종료의 의미가 사라지고 달러기호 자체를 의미합니다.
  • . : Dot는 아무 문자 하나를 나타냅니다. 해당 위치에 문자가 있다는 것만 중요하지 그 문자가 뭐인지는 중요하지 않을 때 사용해요.
  • [] : 대괄호는 목록을 나타냅니다. 해당 목록에 있는 문자 아무거나를 의미해요. 문자들의 순서는 상관 없습니다.
    • 대괄호 안에 ^ 기호가 사용될 경우 반대의 의미입니다. 해당 목록에 있는 문자를 제외하고의 의미입니다.
  • - : 주로 대괄호 안에 사용되는데 범위를 나타냅니다.
    • 예를 들어, [0-9]라고 하면 숫자 하나를 의미하게되죠.
  • () : 그룹을 나타냅니다. 또, 아주 중요한 것이 있는데, back reference로 기억을 해뒀다가 재사용을 할 수 있습니다.
    • 그룹 내에 |를 사용해서 or의 의미로 사용할 수 있습니다.
  • ? : 앞에 있는 패턴이 0 또는 1개를 의미합니다. 쉽게말해 있거나 없거나를 말하죠.
  • * : 앞에 있는 패턴이 0개 이상을 의미합니다.
  • + : 앞에 있는 패턴이 1개 이상을 의미합니다.
  • {m, n} : 앞에 있는 패턴이 m개 이상 n개 이하를 의미합니다.
    • ?는 {0, 1}, *은 {0,}, +는 {1,}로 바꿔쓸 수 있죠.
    • {2}는 정확히 2번 반복됨을 나타내고요.

클래스 문자들도 존재하지만, 이것 역시 지원 여부가 달라서 사용 상에 센스가 좀 필요해요. ㅎㅎㅎ

 

  • \w : [A-Z0-9_] 즉, 영문자, 숫자, _를 의미합니다.
  • \W : \w를 제외한 문자를 의미합니다.
  • \s : Space, Tab, New line을 의미합니다.
  • \S : \s를 제외한 문자를 의미합니다.
  • \b : Boundary의 의미입니다. 즉, 이 클래스 문자가 있는 곳은 다른 문자와의 경계가 되어야 합니다.
  • \B : \b의 반대의 의미입니다.
  • \A : 문자열의 시작을 의미합니다.
  • \Z : 문자열의 끝을 의미합니다.

References

다음 참고자료들은 제가 2년 이상 전부터 참고했던 곳인데, 최근에도 따로 더 좋은 곳은 모르겠어서 요걸로 공유 드려볼게요.

 

손에 잡히는 10분 정규 표현식

COUPANG

www.coupang.com

“파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음"

https://coupa.ng/bSXzMu

이 책은 제가 소장하고 있는 책인데, 얇아서 가볍게 볼 수 있고 내용도 괜찮아서 추천드립니다.
http://zvon.org/comp/r/tut-Regexp.html#Pages~Contents

이 사이트는 간단하게 정규표현식에 대해 정리가 되어 있습니다.
정규표현식을 좀 아는 상태에서 가볍게 훑어보기 좋습니다.
https://regexr.com/

이 사이트에서는 정규표현식을 좀 더 시각적으로 분석해서 복잡한 정규표현식을 이해할 수 있게 해줍니다.
원하는 내용과 정규표현식을 넣어서 확인을 해볼 수도 있어요.
https://regexone.com/

이 사이트에서는 문제를 풀면서 정규표현식을 익혀볼 수 있습니다.

댓글