Поиск слов
Проблема
Требуется выделить из строки отдельные слова.
Решение
Хорошенько подумайте, что должно считаться словом и как одно слово отделяется от остальных.
Затем напишите регулярное выражение, в котором будут воплощены ваши решения. Например:
/\S+/ # Максимальная серия байтов, не являющихся пропусками
/[A-Za-z'-]+/ # Максимальная серия букв, апострофов и дефисов
Комментарий
Концепция «слова» зависит от приложения, языка и входного потока, поэтому в Perl не существует
встроенного определения слов. Слова приходится собирать вручную из символьных классов и квантификаторов,
как это сделано выше. Во втором примере мы пытаемся сделать так, чтобы "shepherd's" и "sheep-sheering"
воспринимались как отдельные слова.
У большинства реализаций имеются ограничения, связанные с вольностями письменного языка.
Например, хотя второй шаблон успешно опознает слова "spank'd" и "counter-clockwise", он выдернет
"rd" из строки "23rd Psalom". Чтобы повысить точность идентификации слов в строке, можно указать
то, что окружает слово. Как правило, указываются метасимволы границ, а не пропусков:
/\b([A-Za-z]+\b/ # Обычно наилучший вариант
/\s([A-Za-z]+)\s/ # Не работает в конце строки или без знаков препинания
В Perl существует метасимвол \w, который совпадает с одним символом, разрешенным в идентификаторах Perl.
Однако идентификаторы Perl редко отвечают нашим представлениям о словах — обычно имеется в виду
последовательность алфавитно-цифровых символов и подчеркиваний, но не двоеточий с апострофами.
Поскольку метасимвол \b определяется через \w, он может преподнести сюрпризы при определении
границ английских слов (и тем более — слов языка суахили).|
И все же метасимволы \b и \В могут пригодиться. Например, шаблон /\Bis\B/ совпадает со
строкой "is" только внутри слова, но не на его границах. Скажем, в "thistle" совпадение будет
найдено, а в "vis-a-vis" — нет.
См. также
Proverte kod v komentariyah gde pro list tam oshibki detskie
Оставить комментарий:
|
|