Идентификация алфавитных символов

Проблема

Требуется узнать, состоит ли строка только из алфавитных символов.

Решение

Наиболее очевидное решение не подходит для общего случая:
if ($var =~ /^[A-Za-z]+$/) {
  # Только алфавитные символы
}
Дело в том, что такой вариант не учитывает локальный контекст пользователя. Если наряду с обычными должны идентифицироваться символы с диакритическими знаками, воспользуйтесь директивой use locale и инвертированным символьным классом:
use locale;
if ($var =~ /^\W\d_]+$/) {
  print "var is purely alphabetic\n";
}

Комментарий

В Perl понятие «алфавитный символ» тесно связано с локальным контекстом, поэтому нам придется немного схитрить. Регулярное выражение \w совпадает с одним алфавитным или цифровым символом, а также символом подчеркивания. Следовательно, \W не является одним из этих символов. Инвертируемый символьный класс [^\W\d_] определяет байт, который не является алфавитным символом, цифрой или подчеркиванием. После инвертирования остаются одни алфавитные символы, которые нас и интересуют. В программе это выглядит так:
use locale;
while (<DATA>) {
  chomp;
  if (/^[^\W\d_]+$/)  {
    print  "$_: alphabetic\n";
  }  else {
       print  "$_: line noise\n";
     }
}

См. также




2013-09-10 17:05:19

Proverte kod v komentariyah gde pro list tam oshibki detskie




Оставить комментарий:
Ваше Имя:
Email:
Антибот: *  
Ваш комментарий: