Masters of CGI.Perl
 Сайт клуба знатоков CGI.Perl 
FAQ · Статьи · Конференция · Ссылки · Скрипты

Часто задаваемые Вопросы.. F.A.Q.

Дайджест от 15.11.2000

Если Вы не нашли ответ на свой вопрос в этом дайджесте, то попробуйте найти его в основной базе:

Ключевые слова

Напоминаем, Вы можете получать FAQ на свой e-mail !!! Достаточно подписаться на нашу почтовую конференцию.
 

  Название : Регулярные выражения  

  1. Какие регулярные выражения наиболее часто применяются ?
  2. Как распечатать список чисел, находящихся в строке, разделенных запятыми ?
  3. Мне нужно возобновить поиск с того места, где было найдено последнее совпадение. Как это сделать ?
  4. Как найти n-ное совпадение подстроки в строке ?
  5. Как можно выделить из строки максимальную серию байтов, не являющихся пропусками ?
  6. Если способ более компактной записи копирования+подстановки ?
  7. Какие существуют наиболее распространенные модификаторы выражений ?
  8. Почему при использовании конструкции $str="good food";$str=~s/o*/e/;, $str принимает значение "egood food", а не "geod food" ?
  9. Как не учитывать регистр в русском тексте? С английским регекспы с ключом i работают, а с русским - нет.
  10. Как ими пользоваться?
  11. А что это за закорючки такие в скрипте - s/^[^\w]{1,3}(\d+)/$1/

 

Какие регулярные выражения наиболее часто применяются ?


Вот наиболее интересные:
Римские цифры - m/^m*(d?c{0,3}|c[dm])(1?x{0,3}|x[1c])(v?i{0,3}|i[vx])$/i
Перестановка двух первых слов - s/(\S+))\s+)(\S+)/$3$2$1/
Строка содержит не менее 80 символов - m/.{80,}/
Смена каталога - s(/usr/bin)(/usr/local/bin)g
Удаление начальных и конечных пропусков - s/^\s+//; и s/\s+$//;
Извлечение всех чисел из строки - @numbers=m/(\d+\.?\d*|\. \d+)/g;

Дата добавления: 5.09.2000 Прислать свои комментарии  Наверх 

Как распечатать список чисел, находящихся в строке, разделенных запятыми ?


Вот пример:
while (/\G,?(\d+)/g) {
print "Число $1\n";
}

Дата добавления: 5.09.2000 Прислать свои комментарии  Наверх 

Мне нужно возобновить поиск с того места, где было найдено последнее совпадение. Как это сделать ?


Воспользуйтесь модификатором /g, метасимволом \G и функцией pos.

Дата добавления: 5.09.2000 Прислать свои комментарии  Наверх 

Как найти n-ное совпадение подстроки в строке ?


Воспользуйтесь модификатором /g и считайте совпадения в цикле while.

Дата добавления: 5.09.2000 Прислать свои комментарии  Наверх 

Как можно выделить из строки максимальную серию байтов, не являющихся пропусками ?


Используйте модификатор /\S+/

Дата добавления: 5.09.2000 Прислать свои комментарии  Наверх 

Если способ более компактной записи копирования+подстановки ?


Для более компактной записи замените:
$dst=$src;
$dst=~s/this/that/;
на запись
($dst=$src)=~s/this/that/;

Дата добавления: 5.09.2000 Прислать свои комментарии  Наверх 

Какие существуют наиболее распространенные модификаторы выражений ?


Самые часто используемые модификаторы:
  • /i - игнорировать регистр (с учетом национальных алфавитов),
  • /x - игнорировать большинство пропусков в шаблонах и разрешить комментарии,
  • /g - глобальный модификатор,
  • /e - правая часть s/// представляет собой выполняемый код

Дата добавления: 5.09.2000 Прислать свои комментарии  Наверх 

Почему при использовании конструкции $str="good food";$str=~s/o*/e/;, $str принимает значение "egood food", а не "geod food" ?


Все правильно. Данное выражение означает:"найти и заменить на e позицию, где o встречается ноль и более раз". Поэтому нулевая позиция заменилась на e.

Дата добавления: 5.09.2000 Прислать свои комментарии  Наверх 

Как не учитывать регистр в русском тексте? С английским регекспы с ключом i работают, а с русским - нет.


Hа UNIX'оподобных системах с корректной локализацией (FreeBSD, Linux на glibc 2.1) это делается так:
    use locale;
use POSIX qw (locale_h);
setlocale(LC_CTYPE, 'ru_RU.KOI8-R');
(можно еще выставить переменную окружения export LANG=ru_RU.KOI8-R тогда будет достаточно вызова use locale; в Perl-скрипте)
Под Windows это делается так:
    use locale;
use POSIX qw (locale_h);
setlocale(LC_CTYPE, "Russian_Russia.1251"); # или "Russian_Russia.866"
С трансляцией АКА tr/XX/xx/ даже не используя use locale; можно так сделать:
    tr/\xB3\xE0-\xFF/\xA3\xC0-\xDF/;            # для KOI8-r
или
    tr/\xA8\xC0-\xDF/\xB8\xE0-\xFF/;            # для Windows-1251
или
    tr/\xF0\x80-\x9F/\xF1\xA0-\xAF\xE0-\xEF/;   # для CP-866

Источник: FIDO - RU.CGI.PERL (FAQ created by SLY Golovanov, 2:5020/794.13)

Дата добавления: 31.08.2000 Прислать свои комментарии  Наверх 

Как ими пользоваться?


Этому учатся всю жизнь. Даже целая книга есть - "Mastering regular expressions". Также следует прочесть perldoc perlre
А начать можно со следующего:
   // - поиск
s/// - поиск и замена
tr/// - трансляция
Если мы хотим узнать, нет ли в строке $_ подстроки 'my', мы пишем:
/my/;
Если мы имеем дело не с переменной по умолчанию, а с любой другой, пишем:
$str=~/my/;
Если мы хотим заменить в строке подстроку tree на root, используем поиск и замену:
$str=~s/tree/root/;

В конце выражения могут стоять опции g, i и т.п. g означает проводить замену не 1 раз, а по всей подстроке. i означает не учитывать регистр символов.
В подстроке для поиска можно использовать управляющие символы. Есть два вида управляющих символов - мета-символы, обозначающие какой-то символ из набора букв, цифр, и т.п., и мета-символы, управляющие количеством. Hапример, \d в подстроке обозначает любую цифру, \w - любую букву, \s - пробел, . - любой символ. Стоящая после мета-символа * означает, что предыдущий символ может повторяться 0 или более раз. + означает повторение 1 или более раз. То есть, строка вида
$str=~s/\s\d+\s/\s1\s/g;
означает "заменить все числа в строке $str, отделенные пробелами с двух сторон, на цифру 1, отделенную пробелами".
Более подробное описание регулярных выражений, список управляющих символов и других возможностей смотрите в документации.

Источник: FIDO - RU.CGI.PERL (FAQ created by SLY Golovanov, 2:5020/794.13)

Дата добавления: 30.08.2000 Прислать свои комментарии  Наверх 

А что это за закорючки такие в скрипте - s/^[^\w]{1,3}(\d+)/$1/


Это регулярные выражения - одна из мощнейших возможностей perl. Средства поиска и замены подстрок в строках

Дата добавления: 30.08.2000 Прислать свои комментарии  Наверх 

Сайт клуба знатоков CGI.Perl - Masters of CGI.Perl
Designed by MoveR Studio © 2000  - | -  Вопросы? Предложения? пишите