Обсуждение на p5p: флаги регулярных выражений

Темы:

На прошлой неделе в рассылке perl5-porters была затронута тема флагов регулярных выражений. В Perl 5.14 появился флаг /a, который ограничивал поиск совпадений для \d, \s и \w символами ASCII, а удвоенный флаг /aa усиливал эффект и исключал поиск совпадений между ASCII и не-ASCII символами (например, k перестаёт совпадать с \N{KELVIN SIGN}).

regexp

Карл Уильямсон предложил признать устаревшим возможность указывать такие флаги в перемешку с другими флагами, например, вместо /aa писать /ama. Также предложено запретить возможность множественного использования флага /i, чтобы в будущем появилась возможность задавать /ii как вариант для задания более простого варианта поиска без учёта регистра (без учёта фолдинга). Это должно улучшить читаемость регулярных выражений. Но...

Комментарии

Дальше →  

Расширенный тип границ в регулярных выражениях

Темы:

Карл Уильямсон работает над реализацией выражения \b{...}, как расширенного варианта \b для задания типа границ в регулярных выражениях.

В Perl 5.22 появятся три варианта таких конструкций:

  1. \b{gcb} — граница кластера графемы (кластер графемы, это две или более кодовых точек образующих один символ, например , состоящий из латинской g и знака двух точек)
  2. \b{cb} — граница предложений. Будет срабатывать там, где по правилам Юникода происходит разделение предложений. Правда предложение Mr. Jones всё равно будет считаться двумя предложениями.
  3. \b{wb} — граница слова.

Кроме того Юникод определяет и перенос строки и его можно реализовать как \b{lb}, но на CPAN уже есть Unicode::LineBreak.

Простое выражение \b определяет границу между символами \w и \W. Хотя большинство новичков почему-то считают, что это граница между \s и \S. Есть мысль реализовать такое как \b{space}, но на самом деле скорее всего имеется ввиду \b{wb}, который действительно хорошо ищет границы для естественных языков, например, он правильно выделит слово don't в предложении ... don't., включив апостроф, но исключив точку.

В этой связи Карл предлагает задать новый флаг для прагмы re

use re "/w"

который бы по умолчанию рассматривал обычный \b как \b{wb} в своей области определения.

Комментарии