perlrecharclass - Perl 正規表現文字クラス
Perl 正規表現に関する最上位文書は perlre です。
このマニュアルページは Perl 正規表現の文字クラスの文法と使用法について 議論します。
文字クラスは、集合の中の一文字がマッチングするというような方法で、 文字の集合を指定するための方法です。 文字集合はソース文字列の中から正確に一文字だけを消費するということを 覚えておくことは重要です。 (ソース文字列とは正規表現がマッチングしようとしている文字列です。)
Perl 正規表現には 3 種類の文字クラスがあります: ドット、 逆スラッシュシーケンス、大かっこで囲まれた形式です。 しかし、「文字クラス」という用語はしばしば大かっこ形式だけを意味するために 使われることに注意してください。 これはその他の Perl 文書では真です。
ドット (またはピリオド) .
はおそらくもっともよく使われ、そして確実に もっともよく知られている文字クラスです。 デフォルトでは、ドットは改行を除く任意の文字にマッチングします。 デフォルトは 単一行 修飾子を使うことで改行にもマッチングするように 変更されます: 正規表現全体に対して /s
修飾子を使うか、ローカルには (?s)
を使います。
以下は例です:
"a" =~ /./ # マッチングする
"." =~ /./ # マッチングする
"" =~ /./ # マッチングしない (ドットは文字にマッチングする必要がある)
"\n" =~ /./ # マッチングしない (ドットは改行にはマッチングしない)
"\n" =~ /./s # マッチングする (グローバル「単一行」修飾子)
"\n" =~ /(?s:.)/ # マッチングする (ローカル「単一行」修飾子)
"ab" =~ /^.$/ # マッチングしない (ドットは一文字にマッチングする)
Perl 正規表現には、文字クラスを構成する多くの逆スラッシュシーケンスを 持ちます。 これは(シーケンスで定義される)ある特定の文字集合に属する一つの文字に マッチングします。 逆スラッシュシーケンスは、逆スラッシュで始まる並びです。 全ての逆スラッシュシーケンスが文字クラスというわけではありません; 完全な リストは、perlrebackslash を参照してください。
以下は文字クラスの逆スラッシュシーケンスの一覧です。 以下でさらに詳細に議論します。
\d 数字にマッチング。
\D 非数字にマッチング。
\w 「単語」文字にマッチング。
\W 非「単語」文字にマッチング。
\s 空白文字にマッチング。
\S 非空白文字にマッチング。
\h 水平空白文字にマッチング。
\H 水平空白でない文字にマッチング。
\N 改行以外の文字にマッチング。実験的。
\v 垂直空白文字にマッチング。
\V 垂直空白でない文字にマッチング。
\pP, \p{Prop} Unicode 特性にマッチする文字にマッチング。
\PP, \P{Prop} Unicode 特性にマッチしない文字にマッチング。
\d
は 数字 と考えられる単一の文字にマッチングします。 何が数字と考えられるかはソース文字列の内部エンコーディングとロケールが 有効かどうかに依存します。 ソース文字列が UTF-8 形式なら、\d
は数字 '0' - '9' だけでなく、Arabic, Devanagari およびその他の言語の数字もマッチングします。 さもなければ、ロケールが有効なら、ロケールが数字と考える文字に マッチングします。 ロケールがなければ、\d
は '0' から '9' の数字にマッチングします。 "Locale, EBCDIC, Unicode and UTF-8" を参照してください。
\d
にマッチングしない任意の文字は \D
にマッチングします。
\w
は単語全体ではなく、単一の英数字(つまり英字または数字)または 下線(_
)にマッチングします。 Perl 識別子文字の文字列にマッチングするために \w+
を使います (これは 英単語にマッチングするものと同じではありません)。 何が単語文字と考えられるかは文字列の内部エンコーディングと有効なロケールや EBCDIC コードページに依存します。 UTF-8 形式の場合、\w
は Unicode データベースで単語文字と考えられるものに マッチングします。 これは、ASCII の文字だけではなく、タイの文字、ギリシャの文字、などにも マッチングするということです。 ソース文字列が UTF-8 形式でない場合、\w
は現在のロケールや EBCDIC コードページで単語文字と考えられるものにマッチングします。 ロケールや EBCDIC コードページなしの場合、\w
は ASCII 文字、数字、下線に マッチングします。 "Locale, EBCDIC, Unicode and UTF-8" を参照してください。
\w
にマッチングしない任意の文字は \W
にマッチングします。
\s
は空白と考えられる単一の文字にマッチングします。 ASCII の範囲では、\s
は水平タブ(\t
)、改行(\n
)、ページ送り(\f
)、 復帰(\r
)、スペースにマッチングします。 (垂直タブ \cK
は \s
にマッチングしません。) \s
がマッチングする文字の正確な集合はソース文字列が UTF-8 形式かどうかや 有効なロケールおよび EBCDIC コードページに依存します。 UTF-8 形式なら、\s
は Unicode データベースで空白と考えられるものに マッチングします; 完全な一覧は後述の表にあります。 さもなければ、ロケールや EBICDIC コードページが有効なら、\s
は現在の ロケールや EBCDIC コードページで空白と考えられるものにマッチングします。 ロケールや EBCDIC コードページなしでは、\s
はこの段落の始めに言及した 五つの文字にマッチングします。 おそらくもっとも顕著な驚きは、non-breaking space は UTF-8 エンコードされた 文字列にあるか、ロケールまたは EBCDIC コードページが有効な場合にのみ、 \s
にマッチングするということです。 "Locale, EBCDIC, Unicode and UTF-8" を参照してください。
\s
にマッチングしない任意の文字は \S
にマッチングします。
\h
は水平空白と考えられる任意の文字にマッチングします; これはスペースと タブ文字および以下の表に上げられている 17 のその他の文字です。 \H
は水平空白と考えられない文字にマッチングします。
\N
は 5.12 の新機能で、実験的なものです。 これは、ドットのように、改行以外の任意の文字にマッチングします。 違いは、\N
は単一行 /s
正規表現修飾子の影響を受けないことです。 \N{...}
の形式の時には \N
の二番目の意味を持つことに注意してください。 この形式は名前付き文字です。 それについては charnames を参照してください。 \N
に引き続いて開き中かっこと量指定子でない何かがある場合、 perl はこの意味での \N
ではなく文字名が来ると仮定します。 例えば、\N{3}
は三つの非改行にマッチングします; \N{5,}
は五つ以上の非改行にマッチングします; しかし \N{4F}
や \N{F4}
は妥当な量指定子ではないので、perl は それぞれ 4F
や F4
という名前の文字を探します(そして、独自の名前を 定義していない限り見つからないのでエラーが発生します)。
\v
は垂直空白と考えられる任意の文字にマッチングします; これは復帰と 行送り(改行)文字に加えて以下の表に上げられている五つのその他の文字です。 \V
は垂直空白と考えられない任意の文字にマッチングします。
\R
は Unicode の規則で改行と考えられるものにマッチングします。 複数文字の並びにマッチングすることもあるので、これは 文字クラスではありません。 従って、大かっこ文字クラスの中では使えません; 代わりに \v
(垂直空白) を 使ってください。 詳細は perlrebackslash で議論しています。
\s
, \d
, \w
と違って、\h
および \v
はソース文字列が UTF-8 形式かどうかに関わらず同じ文字にマッチングします。 マッチングする文字の集合はロケールや EBCDIC コードページの影響も受けません。
\s
が [\h\v]
と等価と考える人がいるかもしれません。 これは正しくありません。 垂直タブ ("\x0b"
) は \s
にマッチングしませんが、垂直空白と 考えられます。 さらに、ソース文字列が UTF-8 形式でないか、これらを含まないロケールや EBCDIC コードページが有効でなければ、next line ("\x85"
) と no-break space ("\xA0"
) 文字は \s
にマッチングしませんが、 それぞれ \v
および \h
にはマッチングします。 ソース文字列が UTF-8 形式なら、next line と no-break space は \s
に マッチングします。
以下の表は Unicode 5.2 現在で \s
, \h
, \v
にマッチングする文字の 完全な一覧です。
最初の列は文字の符号位置(16 進形式)、2 番目の列は (Unicode の)名前です。 3 番目の列はどのクラスにマッチングするかを示しています (\s
のマッチングを変更するようなロケールや EBCDIC コードページが 有効でないことを仮定しています)。
0x00009 CHARACTER TABULATION h s
0x0000a LINE FEED (LF) vs
0x0000b LINE TABULATION v
0x0000c FORM FEED (FF) vs
0x0000d CARRIAGE RETURN (CR) vs
0x00020 SPACE h s
0x00085 NEXT LINE (NEL) vs [1]
0x000a0 NO-BREAK SPACE h s [1]
0x01680 OGHAM SPACE MARK h s
0x0180e MONGOLIAN VOWEL SEPARATOR h s
0x02000 EN QUAD h s
0x02001 EM QUAD h s
0x02002 EN SPACE h s
0x02003 EM SPACE h s
0x02004 THREE-PER-EM SPACE h s
0x02005 FOUR-PER-EM SPACE h s
0x02006 SIX-PER-EM SPACE h s
0x02007 FIGURE SPACE h s
0x02008 PUNCTUATION SPACE h s
0x02009 THIN SPACE h s
0x0200a HAIR SPACE h s
0x02028 LINE SEPARATOR vs
0x02029 PARAGRAPH SEPARATOR vs
0x0202f NARROW NO-BREAK SPACE h s
0x0205f MEDIUM MATHEMATICAL SPACE h s
0x03000 IDEOGRAPHIC SPACE h s
NEXT LINE と NO-BREAK SPACE はソース文字列が UTF-8 形式か、これらを含む ロケールや EBCDIC コードページが有効の場合にのみ \s
にマッチングします。
\d
, \w
などは単語や数値全体ではなく単一の文字にマッチングすると いうことは注意する価値があります。 (整数で構成される)数値にマッチングするには、\d+
を使ってください; 単語に マッチングするには、\w+
を使ってください。
\pP
と \p{Prop}
は指定された Unicode 特性に一致する文字に マッチングする文字クラスです。 一文字特性は \pP
形式で、\p
に引き続いて特性名です; さもなければ 中かっこが必要です。 中かっこを使うとき、単に特性名を中かっこで囲んだ単一形式と、 \p{name=value}
のような形で、文字の特性 "name" が特定の "value" を 持つものにマッチングすることになる複合形式があります。 例えば、数字にマッチングするものは /\pN/
または /\p{Number}/
または /\p{Number=True}/
と書けます。 小文字は LowercaseLetter 特性にマッチングします; これには Ll と言う短縮形式があります。 中かっこが必要なので、/\p{Ll}/
または /\p{Lowercase_Letter}/
または /\p{General_Category=Lowercase_Letter}/
と書きます(下線はオプションです)。 /\pLl/
も妥当ですが、違う意味になります。 これは 2 文字にマッチングします: 英字 (Unicode 特性 \pL
)に引き続いて 小文字の l
です。
さらなる詳細については、 "Unicode Character Properties" in perlunicode を 参照してください; 特性の完全な一覧については "Properties accessible through \p{} and \P{}" in perluniprops を参照して ください。 独自の特性を定義することも可能です。 これは "User-Defined Character Properties" in perlunicode で 議論されています。
"a" =~ /\w/ # マッチング; "a" は「単語」文字。
"7" =~ /\w/ # マッチング; "7" も「単語」文字。
"a" =~ /\d/ # マッチングしない; "a" は数字ではない。
"7" =~ /\d/ # マッチング; "7" は数字。
" " =~ /\s/ # マッチング; スペースは空白。
"a" =~ /\D/ # マッチング; "a" は非数字。
"7" =~ /\D/ # マッチングしない; "7" は非数字ではない。
" " =~ /\S/ # マッチングしない; スペースは非空白ではない。
" " =~ /\h/ # マッチング; スペースは水平空白。
" " =~ /\v/ # マッチングしない; スペースは垂直空白ではない。
"\r" =~ /\v/ # マッチング; 復帰は垂直空白。
"a" =~ /\pL/ # マッチング; "a" は英字。
"a" =~ /\p{Lu}/ # マッチングしない; /\p{Lu}/ は大文字にマッチングする。
"\x{0e0b}" =~ /\p{Thai}/ # マッチング; \x{0e0b} は文字
# 'THAI CHARACTER SO SO' で、これは
# Thai Unicode クラスにある。
"a" =~ /\P{Lao}/ # マッチング; "a" はラオス文字ではない。
Perl 正規表現で使える文字クラスの第 3 の形式は大かっこ形式です。 もっとも単純な形式では、以下のように大かっこの中にマッチングする文字を リストします: [aeiou]
. これは a
, e
, i
, o
, u
のどれかにマッチングします。 他の文字クラスと同様、正確に一つの文字にマッチングします。 文字クラスで言及した文字で構成されるより長い文字列にマッチングするには、 文字クラスに量指定子を付けます。 例えば、[aeiou]+
は一つまたはそれ以上の小文字 ASCII 母音に マッチングします。
文字クラスの中で文字を繰り返しても効果はありません; 一度だけ現れたものと 考えられます。
例:
"e" =~ /[aeiou]/ # マッチング; "e" はクラスにある。
"p" =~ /[aeiou]/ # マッチングしない; "p" はクラスにない。
"ae" =~ /^[aeiou]$/ # マッチングしない; 一つの文字クラスは
# 一文字だけにマッチングする。
"ae" =~ /^[aeiou]+$/ # マッチング; 量指定子により。
正規表現内でメタ文字(つまり、.
, *
, (
のように特別な意味を持つ 文字)となるほとんどの文字は文字クラス内ではエスケープしなくても特別な意味を 失うので、エスケープする必要はありません。 例えば、[()]
は開きかっこまたは閉じかっこにマッチングし、文字クラスの中の かっこはグループや捕捉にはなりません。
文字クラスの中でも特別な意味を持つ文字は: \
, ^
, -
, [
, ]
で、以下で議論します。 これらは逆スラッシュでエスケープできますが、不要な場合もあり、そのような 場合では逆スラッシュは省略できます。
シーケンス \b
は大かっこ文字クラスの内側では特別です。 文字クラスの外側では \b
二つの単語文字か二つの非単語文字のどちらかではない 位置を示す表明ですが、大かっこ文字クラスの内側では \b
は後退文字に マッチングします。
並び \a
, \c
, \e
, \f
, \n
, \N{
NAME
}
, \N{U+
wide hex char
}
, \r
, \t
, \x
も特別で、大かっこ文字クラスの外側と同じ意味を持ちます。
また、逆スラッシュに引き続いて 2 または 3 桁の 8 進数字があると 8 進数として 扱われます。
[
は、POSIX 文字クラス(後述)の開始でない限りは文字クラスの中では 特別ではありません。 これは普通エスケープは不要です。
A ]
は普通は POSIX 文字クラス(後述)の終わりか、大かっこ文字クラスの終了を 示すかどちらかです。 文字集合に ]
を含める必要がある場合、一般的には エスケープしなければなりません。 しかし、]
が大かっこ文字クラスの 最初 (または最初の文字がキャレットなら 2 番目) の文字の場合、(空クラスを作ることはできないので)これはクラスの 終了を意味せず、エスケープなしでマッチングできる文字の集合の一部と 考えられます。
例:
"+" =~ /[+?*]/ # マッチング; 文字クラス内の "+" は特別ではない。
"\cH" =~ /[\b]/ # マッチング; 文字クラスの内側の \b は後退と
# 等価。
"]" =~ /[][]/ # マッチング; 文字クラスに [ と ] の両方を
# 含んでいる。
"[]" =~ /[[]]/ # マッチング; パターンは ] だけを含んでいる
# 文字クラスと、それに引き続く
# ] からなる。
文字のある範囲にマッチングしたいというのは珍しくありません。 幸運なことに、その範囲の文字を全て一覧に書く代わりに、ハイフン (-
) を 使えます。 大かっこ文字クラスの内側で二つの文字がハイフンで区切られていると、 二つの文字の間の全ての文字がクラスに書かれているかのように扱われます。 例えば、[0-9]
は任意の ASCII 数字にマッチングし、[a-m]
は ASCII アルファベットの前半分の小文字にマッチングします。
ハイフンのそれぞれの側の二つの文字は両方とも英字であったり両方とも 数字であったりする必要はないことに注意してください。 任意の文字が可能ですが、勧められません。 ['-?]
は文字の範囲を含みますが、ほとんどの人はどの文字が含まれるか 分かりません。 さらに、このような範囲は、コードが EBCDIC のような異なった文字集合を使う プラットフォームで実行されると移植性の問題を引き起こします。
例えば文字クラスの最初または最後であったり、範囲の直後のために、文字クラスの 中のハイフンが文法的に範囲の一部となれない場合、ハイフンは特別ではなく、 リテラルにマッチングするべき文字として扱われます。 マッチングする文字の集合にハイフンを入れたいけれどもその位置が範囲の 一部として考えられる場合はハイフンを逆スラッシュでエスケープする 必要があります。
例:
[a-z] # 小文字 ASCII 英字にマッチング。
[a-fz] # 'a' から 'f' の英字およびと 'z' の英字に
# マッチング。
[-z] # ハイフン ('-') または英字 'z' にマッチング。
[a-f-m] # 'a' から 'f' の英字、ハイフン ('-')、英字 'm' に
# マッチング。
['-?] # 文字 '()*+,-./0123456789:;<=>? のどれかにマッチング
# (しかし EBCDIC プラットフォームでは異なります)。
代わりにマッチングしたくない文字の一覧を指定することも可能です。 文字クラスの先頭の文字としてキャレット (^
) を使うことで実現します。 例えば、[^a-z]
小文字の ASCII 英字以外の文字にマッチングします。
この文法はキャレットを大かっこ文字クラスの内側で特別な文字にしますが、 クラスの最初の文字の場合のみです。 それでマッチングしたい文字の一つでキャレットを使いたい場合、キャレットを エスケープするか、最初以外の位置に書く必要があります。
例:
"e" =~ /[^aeiou]/ # マッチングしない; 'e' がある。
"x" =~ /[^aeiou]/ # マッチング; 'x' は小文字の母音ではない。
"^" =~ /[^^]/ # マッチングしない; キャレット以外全てにマッチング。
"^" =~ /[x^]/ # マッチング; キャレットはここでは特別ではない。
大かっこ文字クラスの中に(\N
を例外として)逆スラッシュシーケンス 文字クラスを置くことができ、逆スラッシュシーケンスにマッチングする全ての 文字を文字クラスの中に置いたかのように動作します。 例えば、[a-f\d]
は任意の数字、あるいは 'a' から 'f' までの小文字に マッチングします。
大かっこ文字クラスの中のドット .
が特別な意味を持たないのと同じ理由で、 大かっこ文字クラスの中の \N
は \N{
name
}
または \N{U+
wide hex char
}
の形式でなければなりません: これはほとんど何でも マッチングするので、一般的には起こって欲しいことではありません。
例:
/[\p{Thai}\d]/ # タイ文字または数字の文字に
# マッチングする。
/[^\p{Arabic}()]/ # アラビア文字でもかっこでもない文字に
# マッチングする。
逆スラッシュシーケンス文字クラスは範囲の端点の一つにはできません。
Posix 文字クラスは [:class:]
の形式で、class は名前、[:
と :]
は デリミタです。 Posix 文字クラスは大かっこ文字クラスの 内側 にのみ現れ、文字のグループを 一覧するのに便利で記述的な方法ですが、現在の所移植性の問題に影響を与えます (下記と "Locale, EBCDIC, Unicode and UTF-8" を参照してください)。 文法について注意してください、
# Correct:
$string =~ /[[:alpha:]]/
# Incorrect (will warn):
$string =~ /[:alpha:]/
後者のパターンは、コロンおよび a
, l
, p
, h
の文字からなる 文字クラスです。 これら文字クラスはより大きな大かっこ文字クラスの一部にできます。 例えば、
[01[:alpha:]%]
これは妥当で、'0'、'1'、任意の英字、パーセントマークにマッチングします。
Perl は以下の POSIX 文字クラスを認識します:
alpha 任意の英字 ("[A-Za-z]")。
alnum 任意の英数字。("[A-Za-z0-9]")
ascii 任意の ASCII 文字集合の文字。
blank GNU 拡張; スペースまたは水平タブ ("\t") と同じ。
cntrl 任意の制御文字。後述の [2] 参照。
digit 任意の 10 進数字 ("[0-9]"); "\d" と等価。
graph 任意の表示文字; スペースを除く。後述の [3] 参照。
lower 任意の小文字 ("[a-z]")。
print 任意の表示文字; スペースを含む。後述の [4] 参照。
punct 任意の「単語」文字を除く表示文字。[5] 参照。
space 任意の空白文字。"\s" に加えて水平タブ ("\cK")。
upper 任意の大文字 ("[A-Z]")。
word Perl 拡張 ("[A-Za-z0-9_]"); "\w" と等価。
xdigit 任意の 16 進文字 ("[0-9a-fA-F]")。
ほとんどの POSIX 文字クラスには、対応する二つの Unicode 式の \p
特性が あります。 (これは公式 Unicode 特性ではなく、公式 Unicode 特性から派生した Perl エクステンションです。) 以下の表は POSIX 文字クラスと対応するものとの関連を示します。
対応物の一つである、表で "ASCII-range Unicode" と書かれた列のものは、 ASCII の範囲の文字にのみマッチングします。 (EBCDIC プラットフォームでは、ASCII での等価な文字にマッチングします。)
もう一つの対応物である、"Full-range Unicode" と書かれた列のものは、 Unicode 文字集合全体の中の適切な任意の文字にマッチングします。 例えば、\p{Alpha}
は単に ASCII アルファベット文字だけでなく、 Unicode 文字集合全体の中からアルファベットと考えられる任意の文字に マッチングします。
(それぞれの対応物には様々な同義語もあります。 "Properties accessible through \p{} and \P{}" in perluniprops に 全ての同義語と、ASCII 範囲のそれぞれでマッチングする全ての文字の一覧が あります。 例えば、\p{AHex}
は \p{ASCII_Hex_Digit}
の同義語で、 任意の \p
特性名は、\p{IsAlpha}
のように、"Is" 接頭辞が使えます。)
両方の \p
形式はどのロケールが有効かや、文字列が UTF-8 形式かどうかや、 プラットフォームが EBCDIC かどうかに影響を受けません。 一方、POSIX 文字クラスは影響を受けます。 ソース文字列が UTF-8 形式なら、POSIX クラス (例外は [[:punct:]]
です; [5] 参照) は「全体」Unicode 版と似た振る舞いをします。 ソース文字列が UTF-8 形式でなく、ロケールが有効でなく、プラットフォームが EBCDIC でなければ、全ての POSIX クラスは ASCII 範囲版と似た振る舞いをします。 さもなければ、ロケールや EBCDIC コードページのルールに従った振る舞いを します。 Perl の将来のバージョンではこの振る舞いを変えることが提案されています; ソース文字列が UTF-8 かどうかで POSIX 文字クラスの振る舞いに影響を 与えないようにします。 これにより、常に公式な POSIX 標準に厳密に準拠した振る舞いになります。 つまり、ロケールや EBCDIC コードページがあれば、準拠した振る舞いをします; なければ、クラスは ASCII 範囲版にのみマッチングします。 この提案に意義があるなら、perl5-porters@perl.org
にメールを 送ってください。
[[:...:]] ASCII-range Full-range backslash Note
Unicode Unicode sequence
-----------------------------------------------------
alpha \p{PosixAlpha} \p{Alpha}
alnum \p{PosixAlnum} \p{Alnum}
ascii \p{ASCII}
blank \p{PosixBlank} \p{Blank} = [1]
\p{HorizSpace} \h [1]
cntrl \p{PosixCntrl} \p{Cntrl} [2]
digit \p{PosixDigit} \p{Digit} \d
graph \p{PosixGraph} \p{Graph} [3]
lower \p{PosixLower} \p{Lower}
print \p{PosixPrint} \p{Print} [4]
punct \p{PosixPunct} \p{Punct} [5]
\p{PerlSpace} \p{SpacePerl} \s [6]
space \p{PosixSpace} \p{Space} [6]
upper \p{PosixUpper} \p{Upper}
word \p{PerlWord} \p{Word} \w
xdigit \p{ASCII_Hex_Digit} \p{XDigit}
\p{Blank}
と \p{HorizSpace}
は同義語です。
制御文字はそれ自体は出力されず、普通は何か端末を制御します: 例えば 改行と後退は制御文字です。 ASCII の範囲では、序数が 0 から 31 までの範囲の文字および 127 (DEL
) が 制御文字です。
EBCDIC プラットフォームでは、コードページは [[:cntrl:]]
を、ASCII 制御文字の EBCDIC 等価物に加えて、Unicode で序数 128 から 139 を持つものと 定義しています。
graphical、つまり見える文字。 このクラスは全ての英数字と全ての句読点文字。
全ての表示可能な文字; 全ての graphical 文字に加えて制御文字でない空白文字。
ASCII の範囲の \p{PosixPunct}
と [[:punct:]]
は全ての非制御、非英数字、 非空白文字にマッチングします: [-!"#$%&'()*+,./:;<=>?@[\\\]^_`{|}~]
(しかしロケールが有効なら、 [[:punct:]]
の振る舞いが変わります)。
マッチングする文字列が UTF-8 形式のとき、[[:punct:]]
は上述の集合に 加えて、\p{Punct}
にマッチングするものにマッチングします。 これは \p{Punct}
に従って厳密にマッチングするものと違います; なぜなら 上述の集合には、Unicode で句読点ではなく "symbols" として扱われるものが 含まれているからです。 UTF-8 文字列のためのもう一つの言い方は、[[:punct:]]
は Unicode が 句読点として扱うものに加えて、Unicode が "symbols" として扱う ASCII 範囲の 全ての文字にマッチングします。
\p{SpacePerl}
と \p{Space}
の違いは、\p{Space}
は垂直タブ \cK
にもマッチングすると言うことだけです。 二つの ASCII のみの範囲の形式では同じです。
POSIX 文字クラスに対する Perl の拡張は否定の機能です。 これはクラス名の前にキャレット (^
) を置くことで実現します。 いくつかの例です:
POSIX ASCII-range Full-range backslash
Unicode Unicode sequence
-----------------------------------------------------
[[:^digit:]] \P{PosixDigit} \P{Digit} \D
[[:^space:]] \P{PosixSpace} \P{Space}
\P{PerlSpace} \P{SpacePerl} \S
[[:^word:]] \P{PerlWord} \P{Word} \W
Perl は POSIX 文字クラス [=class=]
と [.class.]
を認識しますが、 これらには(まだ?)対応していません。 このような構文の使用はエラーを引き起こします。
/[[:digit:]]/ # 数字の文字にマッチングする。
/[01[:lower:]]/ # 小文字、'0'、'1' のいずれかの文字に
# マッチングする。
/[[:digit:][:^xdigit:]]/ # 'a' から 'f' 以外の任意の文字に
# マッチング。これはメインの文字クラスでは二つの
# POSIX 文字クラスが OR され、一つは任意の数字に
# マッチングし、もう一つは 16 進文字でない全ての
# 文字にマッチングします。従って
# 'a' から 'f' および 'A' から 'F' を
# 除く全ての文字に
# マッチングすることになります。
ソース文字列の内部エンコーディングと有効なロケールに、そしてプログラムが EBCDIC プラットフォームで実行されるかどうかに依存して少し異なった 振る舞いをする文字クラスもあります。
\w
, \d
, \s
および POSIX 文字クラス (および \W
, \D
, \S
を 含むこれらの否定) はこの振る舞いの影響を受けます。 (逆スラッシュシーケンス \b
と \B
は \w
と \W
の点から 定義されているので、これらも影響を受けます。)
ソース文字列が UTF-8 形式なら、文字クラスは Unicode 特性に従って マッチングするという規則です。 ソース文字列が UTF-8 形式ではなければ、文字クラスはロケールや EBCDIC コードページが有効かどうかに従ってマッチングします。 ロケールや EBCDIC が有効でなければ、ASCII のデフォルト (\w
では 52 の英字、 10 の数字と下線; \d
では 0 から 9; など) にマッチングします。
これは普通、ord()
の値が 128 から 255 の範囲の文字にマッチングするなら、 その文字クラスは現在のロケールや EBCDIC コードページ、およびソース文字列が UTF-8 形式かどうかに依存してマッチングしたりしなかったりします。 ord()
値が 255 を超える文字が含まれているなら文字列は UTF-8 形式です。 しかしそのような文字がなくても UTF-8 形式かもしれません。 "The "Unicode Bug"" in perluniprops を参照してください。
移植性の理由により、\w
, \d
, \s
や POSIX 文字クラスは使わず、 Unicode 特性を使う方が良いです。
$str = "\xDF"; # $str は UTF-8 形式ではない。
$str =~ /^\w/; # マッチングしない; $str は UTF-8 形式ではない。
$str .= "\x{0e0b}"; # ここで $str は UTF-8 形式。
$str =~ /^\w/; # マッチング! $str は UTF-8 形式。
chop $str;
$str =~ /^\w/; # まだマッチング! $str は UTF-8 形式のまま。