Я прочитал книгу, в которой говорится, что все фундаментальные операции в регулярных выражениях: concatatenation, or(|), closure(*) и parenthesis, чтобы переопределить приоритет по умолчанию. Любая другая операция - это просто ярлык для одной или нескольких фундаментальных операций.

Например, ярлык (AB)+ расширен до (AB)(AB)* и (AB)? до (ε | AB), где ε - пустая строка. Прежде всего, я посмотрел таблицу ASCII и не уверен, какой код обозначен пустой строкой. Это ASCII 0?

Я хотел бы выяснить, как выразить ярлыки ^ и $ как в выражении ^AB или AB$ в основных операциях, но я не уверен, как это сделать этот. Можете ли вы помочь мне, как это выражается в основах?

3
sanjihan 31 Май 2019 в 10:32

2 ответа

Лучший ответ

Регулярные выражения, как они определены в математике, на самом деле являются строковыми генераторами , а не шаблонами поиска. Они используются в качестве удобной записи для определенного класса наборов строк. (Эти наборы могут содержать бесконечное количество строк, поэтому перечисление всех элементов нецелесообразно.)

В контексте программирования регулярные выражения обычно используются в качестве гибких шаблонов поиска. В математических терминах мы говорим: « найдите подстроку целевой строки S, которая является элементом множества, сгенерированного регулярным выражением R ». Этот поиск подстроки не является частью самого регулярного выражения; это похоже на цикл вокруг фактического движка регулярных выражений, который пытается сопоставить каждую возможную подстроку с регулярным выражением (и останавливается, когда находит совпадение).

В терминах фундаментальных регулярных выражений создается впечатление, что существует неявный .*, добавленный до и после вашего шаблона. Когда вы смотрите на это так, ^ и $ просто не позволяют добавлять .* в начале / конце регулярного выражения.

Кроме того, регулярные выражения (которые обычно используются в программировании) на самом деле не являются «регулярными» в математическом смысле; то есть есть много конструкций, которые не могут быть преобразованы в фундаментальные операции, перечисленные выше. К ним относятся обратные ссылки (\1, \2, ...), границы слов (\b, \<, \>), просмотр в будущее / просмотр назад утверждения ((?= ), (?! ), (?<= ), (?<! )) и другие.

Что касается ε: он не имеет символьного кода, потому что пустая строка является строкой, а не символом. В частности, строка представляет собой последовательность символов, а пустая строка не содержит символов.

7
melpomene 31 Май 2019 в 08:10

^AB может быть выражен как (εAB), т.е. пустая строка, за которой следует AB, и AB$ может быть выражена как (ABε), то есть AB, за которой следует пустая строка.

Пустая строка фактически определяется как '', это строка длиной 0, поэтому она не имеет значения в таблице ASCII. Однако язык программирования C завершает все строки символом ASCII NULL, хотя это не учитывается в длине строки, которую он все равно должен учитывать при выделении памяти.

< Сильный > ИЗМЕНИТЬ Как отметил @melpomene в своем комментарии, εAB эквивалентно AB, что делает вышеуказанное недействительным. Поговорив с рабочим колледжем, я больше не уверен, как это сделать, и даже если это возможно. Надеюсь, кто-то может придумать ответ.

1
JGNI 31 Май 2019 в 07:55