2011-05-25 9 views
4

Механизм разбора строк, который называется «регулярные выражения» в Perl, сильно отличается от того, что известно в терминах «регулярные выражения» в книгах.Как вызывается диалект/реализация регулярных выражений Perl?

Итак, мой вопрос: есть ли какой-либо документ, описывающий реализацию регулярного выражения Perl и как и каким образом он действительно отличается от классического (классическим я имею в виду регулярные выражения, которые действительно могут быть преобразованы в обычные DFA/NFA) и как это работает?

спасибо.

ответ

6

Регулярные выражения Perl, конечно же, называются регулярными выражениями Perl или кратными регулярными выражениями. Их также можно назвать шаблонами или правилами. Но что они есть, или не менее может быть, is recursive descent parsers. Они реализованы с использованием рекурсивного backtracker, хотя вы можете поменять местами DFA engine, если вы предпочитаете разгружать DFA-разрешимые задачи.

Вот некоторые важные цитаты по этим вопросам, со всеми ободрение - и часть текста :) - шахтной:

Вы определяете образец, создавая регулярное выражение (или регулярное выражение) , и движок регулярных выражений Perl («Двигатель», для остальной части этой главы ), затем принимает это выражение и определяет, соответствует ли (и как) шаблон вашим данным. Хотя большинство ваших данных, вероятно, будут текстовых строк, вам нечего останавливать использование регулярных выражений для поиска и заменить любую последовательность байтов, даже то, что вы обычно считаете «двоичными» данными. Для Perl байты просто символы, которые происходят, чтобы иметь порядковое значение меньше, чем 256.

Если вы знакомы с регулярными выражениями из какого-то другого места, мы должен предупредить вас, что регулярные выражения немного отличаются в Perl. Во-первых, они не совсем «правильные» в теоретическом смысле слова , что означает, что они могут делать гораздо больше, чем традиционные регулярные выражения, преподаваемые в классах информатики. Во-вторых, они так часто используются в Perl , что у них есть свои специальные переменные, операторы, и котировочные соглашения, которые тесно интегрированы в язык, не просто болтаются как любая другая библиотека.

- Programming Perl, Ларри Уолл, Том Кристиансен и Джон Orwant

Это Апокалипсис на шаблон Matching, как правило, имеющие отношение к , что мы называем «регулярные выражения», которые только незначительно связан с реальными регулярными выражениями. Тем не менее, этот термин вырос с возможностями наших моделей, совместимых с шаблонами, поэтому я не буду пытаться использовать здесь . Я, однако, обычно называю их «regexes» (или «regexen», когда я нахожусь в англосаксонском настроении).

- Perl6 Apocalypse 5: Pattern Matching, Ларри Уолл

Там много нового синтаксиса там, так что давайте шаг через него медленно, начиная с:

$file = rx/^<$hunk>* $ /; 

Этот оператор создает объект шаблона. Или, как известно в Perl 6, правило « ». Люди, вероятно, до сих пор называют их «регулярные выражения» или « регулярных выражений» тоже (и ключевое слово rx отражает), но модели Perl давно назад перестал быть что-то вроде «регулярный», поэтому мы будем пытаться избежать этих сроки.

[Обновить: Мы воскресили термин «регулярное выражение», чтобы ссылаться на эти шаблоны в вообще. Когда мы говорим «правило» сейчас, мы специально ссылаемся на вид регулярного выражения, который вы будете использовать в грамматике. См S05]

-. Perl6 Exegesis 5: Pattern Matching, Дамиан Конвей

Этот документ суммирует Апокалипсис 5, который о новом регулярное выражение синтаксиса. Попытаемся теперь называть их регулярное выражение, а не «регулярные выражения», потому что они не были регулярными выражениями в течение длительного времени, и мы считаем, что популярный термин «регулярное выражение» находится в процессе становления технический термин с точный смысл: «что-то, что вы делаете с шаблоном, похожее на обычное выражение ». С другой стороны, одна из целей редизайна состоит в том, чтобы сделать части наших шаблонов более поддающимися анализу под традиционной классической семантикой регулярного выражения и анализатора, которая включает в себя , делая тщательные различия между частями наших шаблонов и грамматиками должны рассматриваться как декларативные, а какие - процедурные.

В любом случае, когда речь идет о рекурсивных моделях в грамматике, то термины правила и маркер, как правило, предпочтительны более регулярного выражения.

- Perl6 Synopsis 5: Regexes and Rules, Дамиан Конвей, Эллисон Рэндал, Патрик Мишо, Ларри Уолл, и Moritz Ленца

-2
  • Диалект называется PCRE (Perl-совместимые регулярные выражения).
  • Это задокументировано в Perl manual.
  • Или в «Programming Perl» Уолл, Orwant и Кристиансен
+5

PCRE никогда не был полностью совместим с Perl. – friedo

+2

PCRE - это не Perle Regex Engine. Как раз из имени (Perl-Compatible) вы должны признать, что PCRE не является механизмом регулярного выражения Perl. PCRE - независимый движок. Регулы Perl намного мощнее, чем PCRE. –

+0

Мое понимание заключалось в том, что PCRE зеркалировала библиотеку регулярных выражений Perl, только потому, что они не шли с более поздними изменениями в Perl (поэтому, возможно, отражая Perl 5.6 или 5.8). – ThomasH

4

Книга O'Reilly 'Mastering Regular Expressions' имеет очень хорошее объяснение в Perl и других двигателей. Для меня это справочник по этой теме.

+0

MRE теперь находится в третьем издании (ссылка обновлена), и все еще одна абсолютно необходимая книга о регулярных выражениях. –

+0

Спасибо за информацию Алан. Я должен посмотреть на это! – hexcoder

2

Не существует формального математического названия для языка, принятого PCRE.

Термин «регулярные выражения с backtracking» или «регулярные выражения с обратными ссылками» примерно так же близок, как вы получите. Любой, кто знаком с разницей, будет знать, что вы имеете в виду.

(Существует только два распространенных типа реализаций регулярного выражения: основанные на DFA и основанные на обратном следе. Первые обычно принимают «обычные языки» в традиционном понимании компьютерной науки. Последние обычно принимают ... Подробнее и это зависит от конкретной реализации, но обратные ссылки всегда являются функциями, отличными от DFA.)