Регулярные выражения, как они определены в математике, на самом деле являются генераторами строк , а не шаблонами поиска. Они используются как удобные обозначения для определенного класса наборов строк. (Эти наборы могут содержать бесконечное количество строк, поэтому перечисление всех элементов нецелесообразно.)
В контексте программирования регулярные выражения обычно используются в качестве гибких шаблонов поиска. В математических терминах мы говорим: « найти подстроку целевой строки S, которая является элементом набора, сгенерированного регулярным выражением R ». Этот поиск подстроки не является частью самого регулярного выражения; это похоже на цикл вокруг действительного механизма регулярных выражений, который пытается сопоставить каждую возможную подстроку с регулярным выражением (и останавливается, когда находит совпадение).
В терминах фундаментальных регулярных выражений это похоже на добавление неявного .*
до и после вашего паттерна. Когда вы смотрите на это так, ^
и $
просто препятствуют добавлению .*
в начале / конце регулярного выражения.
Кроме того, регулярные выражения (которые обычно используются в программировании) на самом деле не являются "регулярными" в математическом смысле; то есть есть много конструкций, которые не могут быть преобразованы в фундаментальные операции, перечисленные выше. К ним относятся обратные ссылки (\1
, \2
, ...), границы слов (\b
, \<
, \>
), прогнозные / прогнозные утверждения ((?= )
, (?! )
, (?<= )
, (?<! )
) и др.
Что касается ε: он не имеет символьного кода, потому что пустая строка является строкой, а не символом. В частности, строка представляет собой последовательность символов, а пустая строка не содержит символов.