Perl 정규표현식 백슬래시 시퀀스와 이스케이프

Perl 정규표현식 백슬래시 시퀀스와 이스케이프 (perlrebackslash)

Perl 정규표현식의 모든 백슬래시·이스케이프 시퀀스를 설명하는 문서예요. Perl 정규표현식에 대한 최상위 문서는 perlre예요.

출처: Perl 공식 문서 - perlrebackslash

본문

설명 (DESCRIPTION)

이 문서는 모든 백슬래시·이스케이프 시퀀스를 설명해요. 백슬래시의 역할을 설명한 뒤, Perl 정규표현식에서 특별한 의미를 갖는 모든 시퀀스를 (알파벳 순으로) 나열하고, 각각을 설명해요.

대부분의 시퀀스는 다른 문서에서 자세히 설명돼요. 이 문서의 주된 목적은 모든 백슬래시·이스케이프 시퀀스를 설명하는 빠른 참조 가이드를 제공하는 거예요.

백슬래시 (The backslash)

정규표현식에서 백슬래시는 두 가지 일 중 하나를 해요: 뒤따르는 문자의 특별한 의미를 빼앗거나(예: \|는 교체(alternation)가 아니라 세로 막대에 매치), 백슬래시·이스케이프 시퀀스의 시작이 되거나요.

무엇인지 결정하는 규칙은 꽤 단순해요: 백슬래시 뒤의 문자가 ASCII 구두점(비-단어) 문자라면(즉 글자, 숫자, 밑줄이 아닌 것), 백슬래시는 그냥 뒤따르는 문자의 특별한 의미를 없애요.

백슬래시 뒤의 문자가 ASCII 글자나 ASCII 숫자라면, 그 시퀀스는 특별할 수 있어요. 특별하다면 아래 나열돼 있어요. 몇몇 글자는 아직 사용되지 않았으므로 백슬래시로 이스케이프해도 특별해지지 않아요. 미래의 Perl 버전이 그들에게 특별한 의미를 부여할 수 있으므로, 경고가 켜져 있으면 그런 시퀀스를 사용하면 Perl이 경고를 내요.

하지만 백슬래시 또는 이스케이프 시퀀스 뒤에 구두점 문자가 오는 일은 없음이 보장돼요. 지금도, 미래의 Perl 5 버전에서도요. 그래서 비-단어 문자 앞에 백슬래시를 두는 건 안전해요.

백슬래시 자체도 특별하다는 점을 주의하세요. 백슬래시에 매치하려면 백슬래시를 백슬래시로 이스케이프해야 해요: /\\/는 단일 백슬래시에 매치해요.

또한 패턴 자체 안의 문자가 패턴의 닫는 구분자와 같은 문자라면, 정상 의미를 유지하고 패턴을 끝내는 걸로 오인되지 않도록 이스케이프해야 해요. 즉 그 문자가 메타문자이기도 하면, 이스케이프하면 그 메타문자로 취급돼요. 리터럴로 매치하려면 이스케이프된 시퀀스를 대괄호로 감싸세요:

m...       # Syntax error!
m.\..      # Normal meaning: matches any character but \n
m.[.].     # Syntax error!
m.[\.].    # Matches a literal dot "."

하지만 구분자가 백슬래시면 이 중 어떤 것도 동작하지 않아요:

m\\\       # Syntax error!
m\\\\      # Syntax error!
m\[\]\\    # Syntax error!
m\[\\]\    # Syntax error!

백슬래시를 더 추가해도 도움이 안 돼요. 백슬래시를 구분자로 쓰면서 패턴 안에 백슬래시를 갖길 기대하면 안 돼요.

구분자로 쓰인 문자로 구분된 패턴 안에서 ASCII 글자나 ASCII 숫자를 이스케이프해도 그 시퀀스가 특별한 의미를 갖게 되지 않아요. 예:

qr w\ww

이것은 리터럴 "w" 문자에 매치해요. \w가 보통 매치하는 것에는 매치하지 않아요. 즉 단어 문자에 매치하지 않고, 추가할 수 있는 백슬래시·대괄호의 어떤 조합도 그걸 바꾸지 못해요. "w"를 패턴 구분자로 쓰면 \w의 특별한 의미를 안에서 사용하는 능력을 빼앗는 거예요. 다른 모든 비슷한 경우에도 동일해요.

마지막으로, 위에서 언급했듯 Perl이 현재 특별하다고 인식하지 않는 백슬래시 알파벳 시퀀스를 쓰면 보통 경고가 나요. 이스케이프된 문자가 구분자이기도 하면 그 경고는 억제돼요:

qr C\CC

\C는 리터럴 "C" 문자에 매치하고 경고하지 않아요.

"Gory details of parsing quoted constructs" in perlop도 보세요.

모든 시퀀스와 이스케이프 (All the sequences and escapes)

브래킷 문자 클래스([\da-z] 같은) 안에서 쓸 수 없는 것들은 Not in [].로 표시돼요.

\000              Octal escape sequence.  See also \o{}.
\1                Absolute backreference.  Not in [].
\a                Alert or bell.
\A                Beginning of string.  Not in [].
\b{}, \b          Boundary. (\b is a backspace in []).
\B{}, \B          Not a boundary.  Not in [].
\cX               Control-X.
\d                Match any digit character.
\D                Match any character that isn't a digit.
\e                Escape character.
\E                Turn off \Q, \L and \U processing.  Not in [] unless
                  is terminating one of those also in the [].
\f                Form feed.
\F                Foldcase till \E.
\g{}, \g1         Named, absolute or relative backreference.
                  Not in [].
\G                Pos assertion.  Not in [].
\h                Match any horizontal whitespace character.
\H                Match any character that isn't horizontal whitespace.
\k{}, \k<>, \k''  Named backreference.  Not in [].
\K                Keep the stuff left of \K.  Not in [].
\l                Lowercase next character.
\L                Lowercase till \E.
\n                (Logical) newline character.
\N                Match any character but newline.  Not in [].
\N{}              Named or numbered (Unicode) character or sequence.
\o{}              Octal escape sequence.
\p{}, \pP         Match any character with the given Unicode property.
\P{}, \PP         Match any character without the given property.
\Q                Quote (disable) pattern metacharacters till \E.
                  (Also called "escape".)  Not in [] unless there's a
                  terminating \E before the ']';
\r                Return character.
\R                Generic new line.  Not in [].
\s                Match any whitespace character.
\S                Match any character that isn't a whitespace.
\t                Tab character.
\u                Titlecase next character.
\U                Uppercase till \E.
\v                Match any vertical whitespace character.
\V                Match any character that isn't vertical whitespace
\w                Match any word character.
\W                Match any character that isn't a word character.
\x{}, \x00        Hexadecimal escape sequence.
\X                Unicode "extended grapheme cluster".  Not in [].
\z                End of string.  Not in [].
\Z                End of string.  Not in [].

문자 이스케이프 (Character Escapes)

고정 문자 (Fixed characters)

몇몇 문자는 전용 _문자 이스케이프_를 갖고 있어요. 다음 표는 그것들과 ASCII 코드 포인트(10진·16진), ASCII 이름, ASCII 플랫폼의 제어 이스케이프, 짧은 설명을 보여줘요. (EBCDIC 플랫폼은 "OPERATOR DIFFERENCES" in perlebcdic를 보세요.)

Seq.  Code Point  ASCII   Cntrl   Description.
      Dec    Hex
 \a     7     07    BEL    \cG    alert or bell
 \b     8     08     BS    \cH    backspace [1]
 \e    27     1B    ESC    \c[    escape character
 \f    12     0C     FF    \cL    form feed
 \n    10     0A     LF    \cJ    line feed [2]
 \r    13     0D     CR    \cM    carriage return
 \t     9     09    TAB    \cI    tab

[1] \b는 문자 클래스 안에서만 백스페이스 문자예요. 문자 클래스 밖에서 \b 단독은 단어 문자/비-단어 문자 경계이고, \b{}는 어떤 다른 유형의 경계예요.

[2] \n은 논리적 새 줄에 매치해요. Perl은 텍스트 파일을 읽거나 쓸 때 \n과 OS의 네이티브 새 줄 문자 사이를 변환해요.

예시

$str =~ /\t/;   # Matches if $str contains a (horizontal) tab.

제어 문자 (Control characters)

\c는 제어 문자를 나타내는 데 써요. \c 뒤의 문자가 그 구조의 값을 결정해요. 예를 들어 \cA의 값은 chr(1), \cb의 값은 chr(2) 등이에요. 자세한 내용은 "Regexp Quote-Like Operators" in perlop에 있어요. chr(1) 등이 ASCII·EBCDIC 플랫폼에서 무엇을 의미하는지의 완전한 목록은 "OPERATOR DIFFERENCES" in perlebcdic에 있어요.

정규표현식(또는 이중 인용 문자열) 끝의 \c\ 단독은 유효하지 않아요. 백슬래시 뒤에 다른 문자가 와야 해요. 즉 \c\_X_는 모든 문자 _X_에 대해 chr(28) . '_X_'를 의미해요.

플랫폼 독립 코드를 쓰려면 대신 \N{_NAME_}을 써야 해요. \N{ESCAPE} 또는 \N{U+001B} 같은 것을요. charnames를 보세요.

기억법: c ontrol(제어) 문자.

예시

$str =~ /\cK/;  # Matches if $str contains a vertical tab (control-K).

이름 붙거나 번호가 붙은 문자·문자 시퀀스 (Named or numbered characters and character sequences)

Unicode 문자는 Unicode 이름과 숫자 코드 포인트(서수) 값을 가져요. \N{} 구조로 이 값 중 하나로 문자를 지정해요. 특정 문자 시퀀스에도 이름이 있어요.

이름으로 지정하려면 문자·문자 시퀀스의 이름을 중괄호 사이에 넣어요.

Unicode 코드 포인트로 문자를 지정하려면 \N{U+_code point_} 형태를 써요. _code point_는 Unicode가 원하는 문자에 할당한 코드 포인트를 주는 16진수예요. 숫자를 4자리로 채우기 위해 앞자리 0을 쓰는 것이 관례이지만 필수는 아니에요. 그래서 \N{U+0041}LATIN CAPITAL LETTER A를 의미해요. \N{U+0041}은 EBCDIC 머신("A"의 서수값이 0x41이 아닌 곳)에서도 "A"를 의미해요.

공백은 이름·코드 포인트를 감싸는 중괄호 안에 자유롭게 넣을 수 있어요. 그래서 \N{ U+0041 }은 완전히 합법이에요.

charnames 모듈로 문자·문자 시퀀스에 자신만의 이름을 주는 것도 가능해요. 이 사용자 정의 이름은 어휘 범위(lexically scoped)라, 주어진 코드 포인트가 서로 다른 범위에서 서로 다른 이름을 가질 수 있어요. 사용되는 이름은 \N{}이 확장되는 시점에 유효한 것이에요. 이중 인용 문맥의 패턴이라면 그건 패턴이 파싱되는 시점이에요. 하지만 작은따옴표로 구분된 패턴이라면 확장이 패턴 컴파일 시점까지 연기되는데, 그때는 다른 charnames 번역기가 유효할 수도 있어요.

(디버그 출력에서 볼 수 있는 확장된 내부 형태가 있어요: \N{U+_code point_._code point_...}. ...는 점으로 구분된 _code point_가 몇 개든 의미해요. 이것은 문자들이 이루는 시퀀스를 나타내요. 이것은 내부 형태일 뿐이고 변경될 수 있으므로 직접 쓰려 하면 안 돼요.)

기억법: N amed(이름 붙은) 문자.

이름 붙거나 번호가 붙은 문자로 표현된 문자·문자 시퀀스는 정규식 엔진이 특별한 의미가 없는 문자로 간주해 "그대로" 매치한다는 점을 주의하세요.

예시

$str =~ /\N{THAI CHARACTER SO SO}/;  # Matches the Thai SO SO character

use charnames 'Cyrillic';            # Loads Cyrillic names.
$str =~ /\N{ZHE}\N{KA}/;             # Match "ZHE" followed by "KA".

8진 이스케이프 (Octal escapes)

8진 이스케이프에는 두 가지 형태가 있어요. 각각 8진법으로 지정된 코드 포인트로 문자를 지정해요.

한 형태는 Perl 5.14부터 사용 가능한 \o{...}처럼 생겼고, 점들은 하나 이상의 8진 숫자를 나타내요. 어떤 Unicode 문자에도 쓸 수 있어요.

그것은 모든 Perl에서 쓸 수 있는 다른 형태의 잠재적 문제를 피하려고 도입됐어요. 그 형태는 백슬래시 다음에 8진 숫자 세 개로 구성돼요. 이 형태의 한 문제는 옛 스타일 백레퍼런스와 정확히 똑같이 보일 수 있다는 거예요(아래 "Disambiguation rules between old-style octal escapes and backreferences" 참조). 세 숫자 중 첫 번째를 항상 0으로 만들면 피할 수 있지만, 그러면 \077이 지정할 수 있는 가장 큰 코드 포인트가 돼요.

일부 문맥에서는 백슬래시 다음에 두 개 또는 한 개의 8진 숫자가 8진 이스케이프로 해석될 수 있는데, 때로는 경고와 함께, 그리고 일부 버그 때문에 때로는 놀라운 결과와 함께요. 또한 더 작은 조각을 연결해 정규식을 만드는데 세 자리보다 적게 쓰면, 한 조각의 시작이 앞 조각의 끝에 숫자를 더하는 걸로 해석될 수 있어요. 조각 문제에 대한 자세한 논의와 예시는 "Absolute referencing"을 보세요.

8진 이스케이프로 표현된 문자는 정규식 엔진이 특별한 의미가 없는 문자로 간주해 "그대로" 매치한다는 점을 주의하세요.

요약하면, \o{} 형태는 항상 안전하고, 다른 형태는 정확히 세 자리로 지정할 때 \077을 통한 코드 포인트에 안전하게 쓸 수 있어요.

기억법: 0 ctal 또는 o ctal.

예시 (ASCII 플랫폼 가정)

$str = "Perl";
$str =~ /\o{120}/;  # Match, "\120" is "P".
$str =~ /\120/;     # Same.
$str =~ /\o{120}+/; # Match, "\120" is "P",
                    # it's repeated at least once.
$str =~ /\120+/;    # Same.
$str =~ /P\053/;    # No match, "\053" is "+" and taken literally.
/\o{23073}/         # Black foreground, white background smiling face.
/\o{4801234567}/    # Raises a warning, and yields chr(4).
/\o{ 400}/          # LATIN CAPITAL LETTER A WITH MACRON
/\o{ 400 }/         # Same. These show blanks are allowed adjacent to
                    # the braces

옛 스타일 8진 이스케이프와 백레퍼런스 사이의 모호성 해소 규칙 (Disambiguation rules between old-style octal escapes and backreferences)

브래킷 문자 클래스 밖의 \000 형태의 8진 이스케이프는 잠재적으로 옛 스타일 백레퍼런스(아래 "Absolute referencing" 참조)와 충돌해요. 둘 다 백슬래시 다음에 숫자로 구성되죠. 그래서 Perl은 그것이 백레퍼런스인지 8진 이스케이프인지 결정하는 휴리스틱을 써야 해요. Perl은 다음 규칙으로 모호성을 해소해요:

  1. 백슬래시 뒤에 한 자리 숫자가 오면 백레퍼런스예요.
  2. 백슬래시 뒤의 첫 숫자가 0이면 8진 이스케이프예요.
  3. 백슬래시 뒤의 숫자(10진)가 N인데 Perl이 이미 N개의 캡처 그룹을 봤다면 백레퍼런스로 간주해요. 그렇지 않으면 8진 이스케이프로 간주해요. N이 세 자리보다 많으면 Perl은 8진 이스케이프에 처음 세 자리만 취하고, 나머지는 그대로 매치해요.
my $pat  = "(" x 999;
$pat .= "a";
$pat .= ")" x 999;
/^($pat)\1000$/;   #  Matches 'aa'; there are 1000 capture groups.
/^$pat\1000$/;     #  Matches 'a@0'; there are 999 capture groups
                   #  and \1000 is seen as \100 (a '@') and a '0'.

\g{...} 형태를 쓰면 항상 백레퍼런스 해석을 강제할 수 있어요. \o{...} 형태를 쓰거나, \077(= 10진 63)까지의 숫자에 대해 "0"으로 시작하는 세 자리를 쓰면 항상 8진 해석을 강제할 수 있어요.

16진 이스케이프 (Hexadecimal escapes)

8진 이스케이프처럼 16진 이스케이프에도 두 형태가 있지만, 둘 다 \x 시퀀스로 시작해요. 그 뒤에 정확히 두 자리 16진 숫자가 오거나(숫자를 형성), 중괄호로 감싼 임의 길이의 16진 숫자가 와요. 16진 숫자는 표현하려는 문자의 코드 포인트예요.

이 이스케이프 중 하나로 표현된 문자는 정규식 엔진이 특별한 의미가 없는 문자로 간주해 "그대로" 매치한다는 점을 주의하세요.

기억법: he x adecimal(16진).

예시 (ASCII 플랫폼 가정)

$str = "Perl";
$str =~ /\x50/;    # Match, "\x50" is "P".
$str =~ /\x50+/;   # Match, "\x50" is "P", it is repeated at least once
$str =~ /P\x2B/;   # No match, "\x2B" is "+" and taken literally.

/\x{2603}\x{2602}/ # Snowman with an umbrella.
                   # The Unicode character 2603 is a snowman,
                   # the Unicode character 2602 is an umbrella.
/\x{263B}/         # Black smiling face.
/\x{263b}/         # Same, the hex digits A - F are case insensitive.
/\x{ 263b }/       # Same, showing optional blanks adjacent to the
                   # braces

수정자 (Modifiers)

여러 백슬래시 시퀀스는 뒤따르는 문자(들)를 바꾸는 일을 해요. \l은 뒤따르는 문자를 소문자로, \u는 뒤따르는 문자를 대문자(더 정확히는 titlecase)로 만들어요. 이들은 lcfirstucfirst 함수와 비슷한 기능을 제공해요.

여러 문자를 대문자·소문자로 만들려면 \L 또는 \U를 쓰면 돼요. 이들은 패턴 끝이나 다음 \E가 올 때까지, 먼저 오는 것까지 뒤따르는 모든 문자를 소문자·대문자로 만들어요. lcuc 함수가 제공하는 것과 비슷한 기능을 제공해요.

\Q는 다음 \E 또는 패턴 끝까지 패턴 메타문자를 인용(이스케이프, 비활성화)하는 데 써요. \Q는 Perl에 특별한 의미를 가질 수 있는 어떤 문자에 백슬래시를 추가해요. ASCII 범위에서 글자, 숫자, 밑줄이 아닌 모든 문자를 인용해요. 비-ASCII 코드 포인트에 대해 무엇이 인용되는지의 세부사항은 "quotemeta" in perlfunc를 보세요. 이것을 쓰면 \Q\E 사이의 어떤 문자든 리터럴로 매치되고, 정규식 엔진이 메타문자로 해석하지 않음을 보장해요.

\F는 다음 \E 또는 패턴 끝까지 뒤따르는 모든 문자를 casefold하는 데 쓸 수 있어요. fc 함수와 비슷한 기능을 제공해요.

기억법: L owercase(소문자), U ppercase(대문자), F old-case(foldcase), Q uotemeta(인용), E nd(끝).

예시

$sid     = "sid";
$greg    = "GrEg";
$miranda = "(Miranda)";
$str     =~ /\u$sid/;        # Matches 'Sid'
$str     =~ /\L$greg/;       # Matches 'greg'
$str     =~ /\Q$miranda\E/;  # Matches '(Miranda)', as if the pattern
                             #   had been written as /\(Miranda\)/

문자 클래스 (Character classes)

Perl 정규표현식은 광범위한 문자 클래스를 가져요. 일부 문자 클래스는 백슬래시 시퀀스로 작성돼요. 여기서는 그것들을 간단히 다룰게요. 문자 클래스의 전체 세부사항은 perlrecharclass에서 찾을 수 있어요.

\w는 단일 word(단어) 문자(글자, 숫자, Unicode 표시, 연결 구두점(밑줄 같은))에 매치하는 문자 클래스예요. \d는 십진 숫자에 매치하는 문자 클래스이고, \s는 공백 문자에 매치해요. perl 5.10.0에 새로 추가된 \h\v는 가로·세로 공백 문자에 매치해요.

\d, \s, \w가 매치하는 정확한 문자 집합은 다양한 프래그마와 정규표현식 수정자에 따라 달라져요. /a 정규표현식 수정자를 사용하면 매치를 ASCII 범위로 제한할 수 있어요. perlrecharclass를 보세요.

대문자 변형(\W, \D, \S, \H, \V)은 각각 단어 문자, 숫자, 공백, 가로 공백, 세로 공백이 아닌 어떤 문자에 매치하는 문자 클래스예요.

기억법: w ord(단어), d igit(숫자), s pace(공백), h orizontal(가로), v ertical(세로).

Unicode 클래스 (Unicode classes)

\pP(여기서 P는 단일 글자)와 \p{Property}는 주어진 Unicode 속성에 매치하는 문자를 매치하는 데 써요. 속성에는 "letter"나 "thai character" 같은 것들이 있어요. 시퀀스를 \PP\P{Property}로 대문자화하면 주어진 Unicode 속성에 매치하지 않는 문자에 매치해요. 자세한 내용은 "Backslash sequences" in perlrecharclass"Unicode Character Properties" in perlunicode를 보세요.

기억법: p roperty(속성).

참조 (Referencing)

정규표현식에 캡처 괄호가 쓰이면, 소스 문자열에서 매치된 부분을 참조하고 정확히 같은 것을 매치할 수 있어요. 이러한 백레퍼런스(backreference) 를 참조하는 방법은 세 가지가 있어요: 절대적(absolute), 상대적(relative), 이름(by name).

절대 참조 (Absolute referencing)

\g _N_(Perl 5.10.0부터) 또는 \_N_(옛 스타일) 중 하나인데, _N_은 임의 길이의 양수(부호 없는) 십진수로 캡처 그룹에 대한 절대 참조예요.

_N_은 N번째 괄호 집합을 가리키므로 \g _N_은 그 괄호 집합이 매치한 무엇이든 참조해요. 그래서 \g1은 정규식의 첫 번째 캡처 그룹을 참조해요.

\g _N_ 형태는 \g{_N_}으로 동등하게 쓸 수 있어서, 더 짧은 문자열을 연결해 정규식을 만들 때 모호성을 피할 수 있어요. 그렇지 않으면 정규식 qr/$x$y/가 있고 $x"\g1"이, $y"37"이 들어 있다면 / \g137/을 얻게 되는데, 아마 의도한 게 아닐 거예요.

\_N_ 형태에서 _N_은 "0"으로 시작하면 안 되고, 캡처 그룹이 최소한 _N_개 있어야 해요. 그렇지 않으면 _N_은 8진 이스케이프로 간주돼요(\18 같은 건 \0018과 같아요. 즉 8진 이스케이프 "\001" 다음에 리터럴 숫자 "8"이 오는 거죠).

기억법: g roup(그룹).

예시

/(\w+) \g1/;    # Finds a duplicated word, (e.g. "cat cat").
/(\w+) \1/;     # Same thing; written old-style.
/(\w+) \g{1}/;  # Same, using the safer braced notation
/(\w+) \g{ 1 }/;# Same, showing optional blanks adjacent to the braces
/(.)(.)\g2\g1/; # Match a four letter palindrome (e.g. "ABBA").

상대 참조 (Relative referencing)

\g-_N_(Perl 5.10.0부터)은 상대 주소 지정에 써요. (\g{-_N_}으로 쓸 수 있어요.) \g{-_N_} 앞의 N번째 그룹을 참조해요.

이 형태의 큰 장점은, 더 큰 패턴 안에 삽입될 수 있는 참조가 있는 패턴을 훨씬 쉽게 쓸 수 있다는 거예요. 더 큰 패턴이 캡처 그룹도 포함하더라도요.

예시

/(A)        # Group 1
 (          # Group 2
   (B)      # Group 3
   \g{-1}   # Refers to group 3 (B)
   \g{-3}   # Refers to group 1 (A)
   \g{ -3 } # Same, showing optional blanks adjacent to the braces
 )
/x;         # Matches "ABBA".

my $qr = qr /(.)(.)\g{-2}\g{-1}/;  # Matches 'abab', 'cdcd', etc.
/$qr$qr/                           # Matches 'ababcdcd'.

이름 참조 (Named referencing)

\g{_name_}(Perl 5.10.0부터)은 이름 붙은 캡처 그룹을 백레퍼런스하는 데 쓸 수 있어서, 캡처 버퍼 위치에 대해 생각할 필요를 완전히 없애 줘요.

.NET 정규표현식과 호환되도록 \g{name}\k{name}, \k<name> 또는 \k'name'으로도 쓸 수 있어요.

모호성을 막기 위해 _name_은 숫자로 시작하지도 않고 하이픈을 포함하지도 않아야 해요.

예시

/(?<word>\w+) \g{word}/   # Finds duplicated word, (e.g. "cat cat")
/(?<word>\w+) \k{word}/   # Same.
/(?<word>\w+) \g{ word }/ # Same, showing optional blanks adjacent to
                          # the braces
/(?<word>\w+) \k{ word }/ # Same.
/(?<word>\w+) \k<word>/   # Same.  There are no braces, so no blanks
                          # are permitted
/(?<letter1>.)(?<letter2>.)\g{letter2}\g{letter1}/
                          # Match a four letter palindrome (e.g.
                          # "ABBA")

어서션 (Assertions)

어서션은 참이어야 하는 조건이에요. 실제로 하위 문자열의 일부를 매치하지는 않아요. 백슬래시 시퀀스로 작성되는 어서션은 여섯 개가 있어요.

\A

\A는 문자열의 시작에서만 매치해요. /m 수정자를 쓰지 않으면 / \A//^/와 동등해요. 하지만 /m 수정자를 쓰면 /^/는 내부 새 줄에 매치하지만, / \A/의 의미는 /m 수정자로 바뀌지 않아요. \A/m 수정자 사용 여부와 무관하게 문자열의 시작에서 매치해요.

\z, \Z

\z\Z는 문자열의 끝에서 매치해요. /m 수정자를 쓰지 않으면 / \Z//$/와 동등해요. 즉 문자열의 끝, 또는 문자열 끝의 새 줄 바로 앞에서 매치해요. /m 수정자를 쓰면 /$/는 내부 새 줄에 매치하지만, / \Z/의 의미는 /m 수정자로 바뀌지 않아요. \Z/m 수정자 사용 여부와 무관하게 문자열 끝(또는 뒤따르는 새 줄 바로 앞)에서 매치해요.

\z\Z와 매우 비슷하지만, 뒤따르는 새 줄 앞에서는 매치하지 않는다는 점만 달라요. \z는 사용된 수정자와 무관하게, 그리고 새 줄 바로 앞이 아니라 문자열의 끝에서만 매치해요. 모든 조건에서 매치를 문자열의 진짜 끝에 고정하는 방법이에요.

\G

\G는 보통 /g 수정자와 함께만 쓰여요. /g 수정자를 쓰고 매치가 스칼라 문맥에서 이루어지면, Perl은 소스 문자열에서 마지막 매치가 끝난 위치를 기억하고, 다음에는 이전에 끝난 곳에서 매치를 시작해요.

\G는 그 문자열에서 이전 매치가 끝난 지점, 또는 이전 매치가 없으면 그 문자열의 시작에 매치해요.

기억법: G lobal(전역).

\b{}, \b, \B{}, \B

\b{...}는 v5.22부터 사용 가능한데, 중괄호 안에 지정된 경계 유형에 대한 Unicode 규칙에 따라 (두 문자 사이, 문자열의 첫 문자 앞, 또는 문자열의 마지막 문자 뒤의) 경계에 매치해요. 경계 유형은 몇 문단 아래에 나와 있어요. \B{...}는 같은 유형의 \b{...}가 매치하지 않는 문자 사이의 어떤 지점에 매치해요.

\b는 바로 뒤에 "{"가 오지 않으면 모든 Perl에서 사용 가능해요. 단어(\w가 매치하는 것)와 비-단어 문자(\W) 사이의 어떤 지점에 매치해요. \B는 바로 뒤에 "{"가 오지 않으면 \b가 매치하지 않는 문자 사이의 어떤 지점에 매치해요. 자연어 텍스트의 더 나은 단어 매치를 원하면 아래 "\b{wb}"를 보세요.

\b\B는 소스 문자열의 시작 앞과 끝 뒤에 비-단어 문자가 있다고 가정해요. 그래서 소스 문자열이 단어 문자로 시작(또는 끝)하면 \b는 소스 문자열의 시작(또는 끝)에 매치해요. 그렇지 않으면 \B가 매치해요.

\b=head\d\b 같은 걸 쓰고 그것이 줄의 시작에 매치하길 기대하지 마세요. 그럴 수 없어요. 비-단어 "=" 앞에 경계가 있으려면 바로 앞에 단어 문자가 있어야 하거든요. 모든 평범한 \b·\B 경계 결정은 단어 문자만 찾지, 비-단어 문자나 문자열 끝은 찾지 않아요. \b\B가 어떻게 동작하는지 이해하는 데 도움이 될 수 있도록 다음과 같이 등식으로 나타낼 수 있어요.

\b	really means	(?:(?<=\w)(?!\w)|(?<!\w)(?=\w))
\B	really means	(?:(?<=\w)(?=\w)|(?<!\w)(?!\w))

대조적으로 \b{...}\B{...}는 경계 유형에 따라 줄의 시작·끝에서 매치할 수도 있고 아닐 수도 있어요. 이것들은 https://www.unicode.org/reports/tr14/https://www.unicode.org/reports/tr29/에 지정된 Unicode 기본 경계를 구현해요. 경계 유형은 다음과 같아요.

\b{gcb} 또는 \b{g}

이것은 Unicode "Grapheme Cluster Boundary"(그래핌 클러스터 경계)에 매치해요. (실제로 Perl은 항상 개선된 "extended" 그래핌 클러스터를 써요.) 이것들은 아래 "\X"에서 설명해요. 사실 \X는 같은 기능을 얻는 또 다른 방법이에요. /.+?\b{gcb}/와 동등해요. 상황에서 가장 편리한 걸 쓰세요.

\b{lb}

이것은 기본 Unicode Line Breaking Algorithm(https://www.unicode.org/reports/tr14/)에 따라 매치해요. 그 문서에서는 숫자 표현을 더 잘 처리하도록 사용자화됐어요(revision 35의 Example 7).

이것은 많은 목적에 적합하지만, CPAN에는 사용자화를 포함한 훨씬 더 많은 기능을 제공하는 Unicode::LineBreak 모듈이 있어요.

\b{sb}

이것은 Unicode "Sentence Boundary"(문장 경계)에 매치해요. 이것은 자연어 문장을 파싱하는 데 도움이 돼요. 좋지만 완벽하지는 않은 결과를 줘요. 예를 들어 "Mr. Smith"를 두 문장이라고 생각해요. 자세한 내용은 https://www.unicode.org/reports/tr29/에 있어요. 또한 \R(폼 피드와 세로 탭 제외)에 매치하는 무엇이든 문장 경계라고 생각한다는 점도 주의하세요. \b{sb}는 자동으로 줄을 감싸서 표시하도록 설계된 워드 프로세서용 텍스트와 잘 동작하지만, 하드 코딩된 줄 경계는 본질적으로 텍스트 블록(실제로는 문단)의 끝, 따라서 문장의 끝으로 간주돼요. \b{sb}는 지금 읽고 있는 문서의 소스 텍스트처럼 내장 새 줄을 포함한 텍스트에서는 잘 동작하지 않아요. 그런 텍스트는 문장 경계를 찾기 전에 줄 구분을 제거하도록 전처리해야 해요. 어떤 사람들은 이것을 Unicode 표준의 버그로 보고, 이 동작은 미래 Perl 버전에서 꽤 바뀔 수 있어요.

\b{wb}

이것은 Unicode "Word Boundary"(단어 경계)에 매치하되, Perl 기대에 맞게 조정된 것이에요. 이것은 평범한 \b(중괄호 없는)보다 자연어 처리에 더 나은(완벽하진 않은) 결과를 줘요. 예를 들어 아포스트로피가 단어 중간에 올 수 있고 괄호는 그럴 수 없다는 걸 이해해요(아래 예시 참조). 자세한 내용은 https://www.unicode.org/reports/tr29/에 있어요.

현재 Unicode의 Word Boundary 정의는 모든 공백 문자 사이에서 매치해요. Perl은 5.24 버전부터 이를 조정해서, 평범한 \b가 항상 그랬던 것처럼 일반적으로 공백 범위를 깨지 않게 해요. 이렇게 해서 \b{wb}\b의 드롭인(drop-in) 대체물이 되고, 자연어 처리에는 일반적으로 더 나은 결과를 줘요. (이 조정의 예외는 공백 범위 바로 뒤에 U+0303 COMBINING TILDE 같은 게 올 때예요. 범위의 마지막 공백 문자가 가로 공백이면 그것이 분리되어 결합 문자에 붙어요. 정확히 말하면, 가로 공백으로 끝나는 공백 범위에서 바로 뒤따르는 문자의 Word Boundary 속성 값이 "Extend", "Format" 또는 "ZWJ" 중 하나라면, 마지막 가로 공백 문자와 범위 나머지 사이의 경계가 \b{wb}에 매치해요. 다른 모든 경우 두 공백 문자 사이의 경계는 \B{wb}에 매치해요.)

이 Unicode 경계들을 사용할 때, 더 최신 Unicode 표준을 포함하는 미래 버전의 Perl이 코드를 쓸 때와 정확히 같은 방식으로 동작하지 않을 위험을 감수하고 있다는 걸 인식하는 게 중요해요. 이 규칙들은 안정적이라고 여겨지지 않고, 표준의 나머지보다 좀 더 변경되기 쉬웠어요. Unicode는 그것들을 마음대로 바꿀 권리를, Perl은 구현을 Unicode의 새 규칙으로 업데이트할 권리를 예약해요. 과거에는 이전의 모든 문자와 다른 특성을 가진 새 문자가 표준에 추가돼서 그것들을 처리하는 새 규칙이 정립되기도 했어요. 이것들은 하위 호환 문제를 일으키지 않아야 해요. 하지만 Unicode 기술 위원회가 어떤 이유로든 변경이 정당하다고 결정해서 기존 문자의 처리가 바뀐 경우도 있어요. 버그를 고치기 위해서거나, 새 규칙으로 더 나은 결과를 얻는다고 생각해서일 수 있어요.

또한 이것들은 기본 경계 정의이며, 구현이 특정 목적과 locale에 맞춰 결과를 조정할 수 있음을 인식하는 것도 중요해요. 예를 들어 일본어·태국어 같은 일부 언어는 단어 경계를 정확히 결정하려면 사전 조회가 필요해요.

기억법: b oundary(경계).

예시

 "cat"   =~ /\Acat/;     # Match.
 "cat"   =~ /cat\Z/;     # Match.
 "cat\n" =~ /cat\Z/;     # Match.
 "cat\n" =~ /cat\z/;     # No match.

 "cat"   =~ /\bcat\b/;   # Matches.
 "cats"  =~ /\bcat\b/;   # No match.
 "cat"   =~ /\bcat\B/;   # No match.
 "cats"  =~ /\bcat\B/;   # Match.

 while ("cat dog" =~ /(\w+)/g) {
     print $1;           # Prints 'catdog'
 }
 while ("cat dog" =~ /\G(\w+)/g) {
     print $1;           # Prints 'cat'
 }

 my $s = "He said, \"Is pi 3.14? (I'm not sure).\"";
 print join("|", $s =~ m/ ( .+? \b     ) /xg), "\n";
 print join("|", $s =~ m/ ( .+? \b{wb} ) /xg), "\n";
prints
 He| |said|, "|Is| |pi| |3|.|14|? (|I|'|m| |not| |sure
 He| |said|,| |"|Is| |pi| |3.14|?| |(|I'm| |not| |sure|)|.|

기타 (Misc)

여기서는 위의 범주 중 하나에 해당하지 않는 백슬래시 시퀀스를 문서화해요. 그것들은 다음과 같아요.

\K

이것은 perl 5.10.0에 등장했어요. \K 왼쪽에 매치된 것은 $&에 포함되지 않고, 패턴이 치환에 쓰이면 대체되지 않아요. 이렇게 하면 s/PAT1 \K PAT2/REPL/xs/(PAT1) PAT2/${1}REPL/x 또는 s/(?<=PAT1) PAT2/REPL/x 대신 쓸 수 있어요.

기억법: K eep(유지).

\N

v5.12부터 사용 가능한 이 기능은 새 줄이 아닌 어떤 문자에 매치해요. [^\n]을 쓰는 것의 축약이고, /s 플래그(.의 의미를 바꾸지만 \N은 바꾸지 않는)를 제외하면 . 메타심볼과 동일해요.

\N{...}은 이름 붙거나 번호가 붙은 문자를 의미할 수 있다는 점을 주의하세요.

기억법: \n 의 보수(complement).

\R

\R일반 새 줄(generic newline) 에 매치해요. 즉 Unicode가 줄바꿈 시퀀스로 간주하는 무엇이든에요. 이것은 \v(세로 공백)가 매치하는 모든 문자와 다중 문자 시퀀스 "\x0D\x0A"(캐리지 리턴 다음에 라인 피드; 네트워크 새 줄이라고도 하며, 바이너리 모드로 열린 Microsoft 텍스트 파일에서 쓰이는 줄 끝 시퀀스)를 포함해요. \R(?> \x0D\x0A|\v)와 동등해요. (역추적하지 않는 이유는 그 시퀀스가 분리할 수 없는 것으로 간주되기 때문이에요. 즉:

"\x0D\x0A" =~ /^\R\x0A$/   # No match

가 실패하는데, \R이 전체 문자열을 매치하고 역추적하여 "\x0D"만 매치하지 않기 때문이에요.) \R은 한 문자 이상의 시퀀스에 매치할 수 있으므로 브래킷 문자 클래스 안에 넣을 수 없어요. /[\\R]/은 오류이고, 대신 \v를 쓰세요. \R은 perl 5.10.0에서 도입됐어요.

이것은 유효한 어떤 locale도 존중하지 않고, 플랫폼의 네이티브 문자 집합에 따라 매치한다는 점을 주의하세요.

기억법: 정말로 없어요. \R은 PCRE가 이미 \R을 쓰고, 더 중요하게는 Unicode가 그러한 정규표현식 메타문자를 권장하며 표기로 \R을 제안하기 때문에 고른 거예요.

\X

이것은 Unicode 확장 그래핌 클러스터(extended grapheme cluster) 에 매치해요.

\X는 일반(비-Unicode 프로그래머) 사용법이 단일 문자로 간주하는 것을 꽤 잘 매치해요. 예를 들어 화살표 같은 결합 구별 부호가 있는 G를 생각해 보세요. Unicode에는 그런 단일 문자가 없지만, G 다음에 Unicode "COMBINING UPWARDS ARROW BELOW"를 붙이면 합성할 수 있고, Unicode를 아는 소프트웨어는 그것을 단일 문자처럼 표시해요.

매치는 탐욕적이고 비-역추척이라, 클러스터는 더 작은 구성 요소로 절대 분리되지 않아요.

\b{gcb}도 보세요.

기억법: e X tended(확장) Unicode 문자.

예시

$str =~ s/foo\Kbar/baz/g; # Change any 'bar' following a 'foo' to 'baz'
$str =~ s/(.)\K\g1//g;    # Delete duplicated characters.

"\n"   =~ /^\R$/;         # Match, \n   is a generic newline.
"\r"   =~ /^\R$/;         # Match, \r   is a generic newline.
"\r\n" =~ /^\R$/;         # Match, \r\n is a generic newline.

"P\x{307}" =~ /^\X$/     # \X matches a P with a dot above.

더 알아보기