20

Perl\wは、Unicode 標準で定義されているすべての英数字と一致しますか?

たとえば、\wすべての (たとえば) 中国語とロシア語の英数字に一致しますか?

\w私がテストした非 ASCII 英数字に対して「期待どおり」に実際に一致することを示唆する簡単なテスト スクリプト (以下を参照) を作成しました。しかし、テストは明らかに網羅的ではありません。

#!/usr/bin/perl                                                                                                                                                                                                  

use utf8;

binmode(STDOUT, ':utf8');

my @ok;
$ok[0] = "abcdefghijklmnopqrstuvwxyz";
$ok[1] = "éèëáàåäöčśžłíżńęøáýąóæšćôı";
$ok[2] = "şźüęłâi̇ółńśłŕíáυσνχατςęςη";
$ok[3] = "τσιαιγολοχβςανنيرحبالтераб";
$ok[4] = "иневоаслкłјиневоцедањеволс";
$ok[5] = "рглсывызтоμςόκιναςόγο";

foreach my $ok (@ok) {
    die unless ($ok =~ /^\w+$/);
}
4

3 に答える 3

19

perldoc perlunicode言う

正規表現の文字クラスは、バイトではなく文字と一致し、Unicode プロパティ データベースで指定された文字プロパティと一致します。\wたとえば、日本語の表意文字に一致させるために使用できます。

したがって、あなたの質問に対する答えは「はい」のようです。

ただし、構造体を使用して、特定のUnicode 文字プロパティ\p{}に直接アクセスしたい場合があります。おそらく、文字や数字に (または短く) を使用すると、希望どおりの結果が得られるという自信が少し増します。\p{L}\pL\pN

于 2011-04-05T17:12:51.073 に答える
12

はいといいえ。

すべての英数字が必要な場合は、[\p{Alphabetic}\p{GC=Number}]. \wには、それより多いものと少ないものの両方が含まれます。上付き文字、下付き文字、および分数のように、またはで\pNないものは明確に除外されます。それらはであり、 には含まれません。\p{Nd}\p{Nl}\p{GC=Other_Number}\w

ほとんどの正規表現システムとは異なり、Perl はUnicode 正規表現に関する UTS #18の要件 1.2a、「互換性プロパティ」</a> に準拠しているため、Unicode 文字列があると仮定すると、正規表現の aは、次のいずれかを持つ単一のコード ポイントに一致します。次の 4 つのプロパティ:\w

  1. \p{GC=Alphabetic}
  2. \p{GC=Mark}
  3. \p{GC=Connector_Punctuation}
  4. \p{GC=Decimal_Number}

上記の番号 4 は、次のいずれかの方法で表すことができます。これらはすべて同等と見なされます。

  • \p{Digit}
  • \p{General_Category=Decimal_Number}
  • \p{GC=Decimal_Number}
  • \p{Decimal_Number}
  • \p{Nd}
  • \p{Numeric_Type=Decimal}
  • \p{Nt=De}

\p{Digit}と同じではないことに注意してください\p{Numeric_Type=Digit}。たとえば、コード ポイント B2、SUPERSCRIPT TWO には\p{Numeric_Type=Digit}プロパティのみがあり、plain はありません\p{Digit}。これは、\p{Other_Number}またはと見なされるため\p{No}です。ただし、\p{Numeric_Value=2}想像どおりのプロパティがあります。

\p{Alphabetic}人々に最も厄介な問題を与えるのは、まさに上記のポイント 1です。\p{Letter}これは、 ( )と何らかの形で同じであると誤って考えることがあまりにも多いためです\pLが、そうではありません。

アルファベット順にはそれよりもはるかに多くのものが\p{Other_Alphabetic}含まれますが、これはすべてプロパティのためです。これには、すべてではなく一部が含まれるため、すべて(これはを追加するためと同じではありません) およびすべて(これは を追加するためと同じではありません) .\p{GC=Mark}\p{Lowercase}\p{GC=Ll}\p{Other_Lowercase}\p{Uppercase}\p{GC=Lu}\p{Other_Uppercase}

それが、\p{GC=Letter_Number}ローマ数字や丸で囲まれたすべての文字のよう\p{Other_Symbol}に引き込む方法\p{Block=Enclosed_Alphanumerics}です。

使っていただけると嬉しい\wです? :)

于 2011-04-05T19:49:21.320 に答える
2

特に\w、アンダースコア文字にも一致します。

#!/usr/bin/perl -w
$name = 'Arun_Kumar';
($name =~ /\w+/)? print "Underscore is a word character\n": print "No underscores\n";
$ underscore.pl 

アンダースコアは単語の文字です。

于 2013-04-04T07:41:53.077 に答える