PerlのUnicode文字列で完全に構成された文字のみを一致させるにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/203605

質問

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

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

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

役に立ちましたか?

解決

echo あ| perl -nle 'BEGIN{binmode STDIN,":utf8"} print"[<*>

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

]"; print /[[:print:]]/ ? "YES" : "NO"'

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

他のヒント

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

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

更新:Unicodeを使用すると、言語に依存する動作は行われませんが、言語に関係なく正常なデフォルトが使用されます。これはあなたが望むものであるかもしれないし、そうでないかもしれないが、プリンシパル/制御キャラクターの区別のために、言語依存の振る舞いが必要な理由はわかりません。

\ 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章を簡略化したもの)です。

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top