정규 표현식
정규 표현식 (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 문서를 확인해 보세요.