正規表現で用いられる文字クラスの表記法として、次のような略記法が広くサポートされています。
文字クラス | 意味 | 例 |
\d | 数字 | [0-9] |
\D | 数字以外 | [^\d] |
\w | 単語の一部だとみなされる文字 | [a-zA-Z0-9_] |
\W | 単語の一部ではない文字 | [^\w] |
\s | 空白文字 | [ \f\n\r\t\v] |
\S | 空白文字以外 | [^\s] |
実際にどの文字にマッチするかは、システムに依存します。さらに、Unicodeをサポートする環境とそうでない環境では、マッチする文字が変わります。
例として、空白文字にマッチする \s
について、次のような Perl のコードで調べてみます。
use charnames ':full';
for my $code (0x0..0xFFFF) {
if (chr($code) =~ /^\s$/) {
printf("U+%04X %s\n", $code, charnames::viacode($code));
}
}
実行結果は次のようになります。(Ubuntu 22.04 LTS の Perl 5.34 を使用。以下同様)
U+0009 CHARACTER TABULATION U+000A LINE FEED U+000B LINE TABULATION U+000C FORM FEED U+000D CARRIAGE RETURN U+0020 SPACE U+1680 OGHAM SPACE MARK U+2000 EN QUAD U+2001 EM QUAD U+2002 EN SPACE U+2003 EM SPACE U+2004 THREE-PER-EM SPACE U+2005 FOUR-PER-EM SPACE U+2006 SIX-PER-EM SPACE U+2007 FIGURE SPACE U+2008 PUNCTUATION SPACE U+2009 THIN SPACE U+200A HAIR SPACE U+2028 LINE SEPARATOR U+2029 PARAGRAPH SEPARATOR U+202F NARROW NO-BREAK SPACE U+205F MEDIUM MATHEMATICAL SPACE U+3000 IDEOGRAPHIC SPACE
水平タブ(\t
, U+0009)、改行(\n
, U+000A)、垂直タブ(\v
, U+000B)、書式送り(\f
, U+000C)、復帰 (\r
, U+000D)、通常のスペース(U+0020)の他、様々な幅のスペース、行分割子(U+2028)、段落分割子(U+2029)にマッチします。U+3000はいわゆる全角スペースです。
次に、コードの先頭に use feature 'unicode_strings'
を追加して、再度実行してみます。
U+0009 CHARACTER TABULATION
U+000A LINE FEED
U+000B LINE TABULATION
U+000C FORM FEED
U+000D CARRIAGE RETURN
U+0020 SPACE
U+0085 NEXT LINE
U+00A0 NO-BREAK SPACE
U+1680 OGHAM SPACE MARK
U+2000 EN QUAD
U+2001 EM QUAD
U+2002 EN SPACE
U+2003 EM SPACE
U+2004 THREE-PER-EM SPACE
U+2005 FOUR-PER-EM SPACE
U+2006 SIX-PER-EM SPACE
U+2007 FIGURE SPACE
U+2008 PUNCTUATION SPACE
U+2009 THIN SPACE
U+200A HAIR SPACE
U+2028 LINE SEPARATOR
U+2029 PARAGRAPH SEPARATOR
U+202F NARROW NO-BREAK SPACE
U+205F MEDIUM MATHEMATICAL SPACE
U+3000 IDEOGRAPHIC SPACE
U+0085 NEXT LINE と U+00A0 NO-BREAK SPACE に新たにマッチするようになりました。use feature 'unicode_strings'
はUnicodeの規則に従った文字列操作を行うよう指示するプラグマですが、use v5.12;
以降のバージョンのプラグマを指定した際にも有効になる1ので、知らないうちに有効になっているかもしれません。
このように、同一の処理系でも、Unicode取り扱いのパラメータの違いによってもマッチする文字列が変化することに注意が必要です。
perl -e 'use B::Deparse; use v5.12; use feature "say"; say B::Deparse->new("-p", "-sC")->coderef2text(sub { 1; })';
とすることで、どのfeatureプラグマが有効になるかがわかります。 ↩︎
コメント