정규 표현식

정규 표현식 (Regular Expressions)

정규 표현식은 Regex 클래스로 표현돼요.

Regex는 보통 PCRE2 문법을 사용하는 정규 표현식 리터럴로 만들어져요. 슬래시(/)로 감싼 UTF-8 문자 문자열로 구성돼요:

/foo|bar/
/h(e+)llo/
/\d+/
/あ/

NOTE: Crystal 1.8 이전에는 컴파일러가 정규 표현식 리터럴이 원래 PCRE 패턴 문법을 따르기를 기대했어요. 더 새로운 PCRE2 패턴 문법1.8에서 도입됐어요.

이스케이프 (Escaping)

정규 표현식은 String 리터럴과 같은 이스케이프 시퀀스를 지원해요.

/\//         # slash
/\\/         # backslash
/\e/         # escape
/\f/         # form feed
/\n/         # newline
/\r/         # carriage return
/\t/         # tab
/\v/         # vertical tab
/\N88/       # octal ASCII character
/\xFF/       # hexadecimal ASCII character
/\x{FFFF}/   # hexadecimal unicode character
/\x{10FFFF}/ # hexadecimal unicode character

구분자 문자 /는 슬래시로 구분된 정규 표현식 리터럴 안에서 이스케이프해야 해요. PCRE 문법의 특수 문자를 리터럴 문자로 쓰려면 이스케이프해야 한다는 점도 기억하세요.

보간 (Interpolation)

보간은 문자열 리터럴에서처럼 정규 표현식 리터럴에서도 동작해요. 이 기능을 쓸 때 결과 문자열이 유효하지 않은 정규 표현식이 되면 런타임에 예외가 발생한다는 점을 알아두세요.

수정자 (Modifiers)

닫는 구분자 뒤에는 정규 표현식의 매칭 동작을 조정하는 선택적 수정자를 몇 개 붙일 수 있어요.

  • i: 대소문자 구분 없는 매칭(PCRE_CASELESS): 패턴의 유니코드 문자는 대상 문자열에서 대문자와 소문자 모두에 매칭돼요.
  • m: 여러 줄 매칭(PCRE_MULTILINE): 줄의 시작 (^)과 줄의 끝 ($) 메타문자가 대상 문자열의 내부 줄바꿈 바로 앞·뒤뿐 아니라 맨 처음과 맨 끝에도 매칭돼요.
  • x: 확장 공백 매칭(PCRE_EXTENDED): 패턴의 대부분의 공백 문자는 문자 클래스 안에 있거나 무시되는 경우가 아니면 완전히 무시돼요. 이스케이프되지 않은 해시 문자 #는 줄 끝까지의 주석 시작을 뜻해요.
/foo/i.match("FOO")         # => #<Regex::MatchData "FOO">
/foo/m.match("bar\nfoo")    # => #<Regex::MatchData "foo">
/foo /x.match("foo")        # => #<Regex::MatchData "foo">
/foo /imx.match("bar\nFOO") # => #<Regex::MatchData "FOO">

퍼센트 정규 표현식 리터럴 (Percent regex literals)

슬래시로 구분된 리터럴 외에도, 정규 표현식은 %r과 구분자 한 쌍으로 표시되는 퍼센트 리터럴로 표현할 수 있어요. 유효한 구분자는 괄호 (), 대괄호 [], 중괄호 {}, 꺾쇠 <>, 파이프 ||예요. 파이프를 제외한 모든 구분자는 중첩될 수 있어요. 리터럴 안의 시작 구분자는 다음 끝 구분자를 이스케이프한다는 뜻이에요.

이들은 슬래시로 구분된 리터럴에서 이스케이프해야 할 슬래시를 포함하는 정규 표현식을 쓸 때 유용해요.

%r((/)) # => /(\/)/
%r[[/]] # => /[\/]/
%r{{/}} # => /{\/}/
%r<</>> # => /<\/>/
%r|/|   # => /\//

출처: Crystal 공식 문서

더 알아보기 (Learn more)

  • 정규 표현식 API는 Regex 문서를 확인해 보세요.