8

Unicode 文字列内の完全に構成された文字のみを一致させる方法を探しています。

[:print:]この文字クラスを組み込んだ正規表現の実装では、ロケールに依存していますか? たとえば、日本語の「あ」は制御文字ではないため一致しますか、それとも[:print:]常に ASCII コード 0x20 ~ 0x7E になりますか?

制御文字以外のものと一致させるために使用できる、Perl RE を含む文字クラスはありますか? [:print:]ASCII範囲の文字のみが含まれている場合、私もそうすると思い[:cntrl:]ます。

4

5 に答える 5

6
echo あ| perl -nle 'BEGIN{binmode STDIN,":utf8"} print"[$_]"; print /[[:print:]]/ ? "YES" : "NO"'

これはほとんどの場合機能しますが、ワイド文字に関する警告が生成されます。しかし、それはあなたにアイデアを与えます:あなたは本当のユニコード文字列を扱っていることを確認しなければなりません(utf8::is_utf8をチェックしてください)。またはperlunicodeをチェックするだけでも構いません。

于 2008-10-15T05:27:30.287 に答える
5

そのためのロケールは必要ない、または必要ないと思いますが、むしろUnicodeが必要です。テキスト文字列をデコードした場合\w、任意の言語の単語文字に一致し、すべての Unicode 数字などに\d一致0..9します。正規表現では、 で Unicode プロパティをクエリできます\p{PropertyName}。あなたにとって特に興味深いのは\p{Print}. 使用可能なすべての Unicode 文字プロパティのリストを次に示します

私はUnicode と Perl の基本と微妙さについての記事を書きました。これは、perl が文字列を単なるバイトのシーケンスではなく、文字のシーケンスとして認識するために何をすべきかについての良いアイデアを提供するはずです。

更新: Unicode を使用すると、言語に依存した動作は得られませんが、代わりに言語に関係なく正常なデフォルトが得られます。これはあなたが望むものかもしれませんし、そうでないかもしれませんが、印刷可能/制御文字の区別のために、言語依存の動作が必要な理由がわかりません。

于 2008-10-15T06:48:26.190 に答える
4

\X完全に構成された文字 (シーケンス) に一致します。証拠:

#!/usr/bin/env perl
use 5.010;
use utf8;
use Encode qw(encode_utf8);

for my $string (qw(あ ご ご), "\x{3099}") {
    say encode_utf8 sprintf "%s $string", $string =~ /\A \X \z/msx ? 'ok' : 'nok';
}

テスト データは次のとおりです: 通常の文字、結合前の文字、結合文字シーケンス、および結合文字 (それ自体では「カウントされません」。Unicode の第 3 章の簡略化)。

で置き換えて、 Tanktalus\X[[:print:]]回答が最後の 2 つのケースで誤った一致を生成することを確認します。

于 2010-01-07T23:12:47.990 に答える
2

はい、これらの式はロケールに依存します。

于 2008-10-15T03:11:14.803 に答える
1

文字クラス[^[:cntrl:]]を使用して、非制御文字に一致させることができます。

于 2008-10-15T03:26:58.080 に答える