\ W соответствует ли все буквенно-цифровые символы, определенные в стандарте Unicode? - PullRequest
11 голосов
/ 05 апреля 2011

Соответствует ли 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+$/);
}

Ответы [ 3 ]

14 голосов
/ 05 апреля 2011

perldoc perlunicode говорит

Классы символов в регулярных выражениях сопоставляют символы вместо байтов и сопоставляют со свойствами символов, указанными в базе данных свойств Unicode. Например, \w можно использовать для сопоставления с японской идеографией.

Так что, похоже, ответ на ваш вопрос "да".

Однако вы можете использовать конструкцию \p{} для прямого доступа к определенным символьным свойствам Unicode . Вы, вероятно, можете использовать \p{L} (или, короче, \pL) для букв и \pN для цифр и чувствовать себя немного увереннее, что вы получите именно то, что вы хотите.

11 голосов
/ 05 апреля 2011

Да и нет.

Если вам нужны все буквенно-цифровые символы, вам нужно [\p{Alphabetic}\p{GC=Number}].\w содержит больше и меньше этого.В частности, он исключает любые \pN, которые не являются \p{Nd} и \p{Nl}, такие как верхние индексы, индексы и дроби.Это \p{GC=Other_Number} и они не включены в \w.

Поскольку в отличие от большинства систем регулярных выражений, Perl соответствует Требованию 1.2a, «Свойства совместимости» из UTS #18 в регулярных выражениях Unicode , затем при условии, что у вас есть строки Unicode, a \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}, а не простое \p{Digit}.Это потому, что он считается \p{Other_Number} или \p{No}.Однако у него есть свойство \p{Numeric_Value=2}, как вы и представляете.

На самом деле пункт 1 выше, \p{Alphabetic}, доставляет людям больше всего хлопот.Это потому, что они слишком часто ошибочно думают, что это что-то такое же, как \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?:)

0 голосов
/ 04 апреля 2013

В частности, \w также соответствует символу подчеркивания.

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

Символ подчеркивания - это символ слова.

...