英語以外の文字(スペイン語、フランス語、ドイツ語、ロシア語)を含むテキストに対して正規表現の一致を実行する必要があります。
大文字と小文字を区別しないようにしたいので、英語の文字では修飾子を使用しますが、 übermäßig/i
のような単語では機能しません。
たとえば、übermäßigとÜBERMÄßigの両方に一致する正規表現を作成する最も簡単な方法は何ですか?また、同じアプローチを使用して、英語以外の大文字をPerlで同等の小文字に変換できますか?
それは完全にうまく機能します
$ perl -E'use utf8; say "ÜBERMÄẞIG" =~ /^übermäßig\z/i ? "match" : "no match"'
match
$ perl -E'use utf8; say "ÜBERMÄSSIG" =~ /^übermäßig\z/i ? "match" : "no match"'
match
(use utf8;
ソースコードはUTF-8を使用してエンコードされているとのことです。他の方法でこれらの文字をスクリプトに含めることは不可能です。)
エンコーディングの問題が疑われます。つまり、Perlに「ß」を付けたのに与えなかったと思います。また、複数文字の折り畳みを正しく処理できない古いバージョンのPerlを使用している可能性もあります。一般的に言えば、を使用すると役立つ場合があります/u
が、この例では違いはありません。
文字列がPerlの/i
内部エンコーディングを使用している場合、修飾子はうまく機能します。
たとえば、これは「yes」を出力します。
perl -le 'use utf8; print "yes" if "ÜBERMäßig" =~ /überMÄßiG/i'
" use utf8
"は、ソースコードがUTF-8でエンコードされていることをPerlに通知します。したがって、Perlは、ソースコード内のすべてのリテラル文字列をUTF-8から内部エンコードにデコードします。この例は、がないと機能しませんuse utf8
。
文字列が別の場所からのものである場合は、適用する必要がある場合がありますEncode::decode
。または、適切にデコードされた文字列を生成するようにソースに指示します(たとえば、ほとんどのDBI
ドライバーで可能)。
Perlスクリプトでロケールを適切な値に設定すると、修飾子/i
は英語以外の文字で機能します。単語境界の正規表現マッチングuc
やandlc
関数などの他の機能も同様です。
複数の外部文字セットを処理する必要がある場合は、リンクされたドキュメントに、を使用して、必要に応じてスクリプト内でロケールを切り替える方法が示されていることに注意してくださいsetlocale()
。
編集:このメソッドはほとんどの場合非推奨であることに言及する必要がありました。物事はUTF-8で動作するはずです。しかし、それでも時々役立つことがあります。
わたしにはできる。たぶん、する必要がありますuse utf8;
か?
(免責事項:私はPerlを知りません。)
use locale;
use POSIX qw(locale_h);
setlocale (LC_ALL, $locale{German}) or die "failed to load locale!";