Я прочитал книгу, в которой говорится, что все фундаментальные операции в регулярных выражениях: concatatenation
, or(|)
, closure(*)
и parenthesis
, чтобы переопределить приоритет по умолчанию. Любая другая операция - это просто ярлык для одной или нескольких фундаментальных операций.
Например, ярлык (AB)+
расширен до (AB)(AB)*
и (AB)?
до (ε | AB)
, где ε
- пустая строка. Прежде всего, я посмотрел таблицу ASCII и не уверен, какой код обозначен пустой строкой. Это ASCII 0
?
Я хотел бы выяснить, как выразить ярлыки ^
и $
как в выражении ^AB
или AB$
в основных операциях, но я не уверен, как это сделать этот. Можете ли вы помочь мне, как это выражается в основах?
2 ответа
Регулярные выражения, как они определены в математике, на самом деле являются строковыми генераторами , а не шаблонами поиска. Они используются в качестве удобной записи для определенного класса наборов строк. (Эти наборы могут содержать бесконечное количество строк, поэтому перечисление всех элементов нецелесообразно.)
В контексте программирования регулярные выражения обычно используются в качестве гибких шаблонов поиска. В математических терминах мы говорим: « найдите подстроку целевой строки S, которая является элементом множества, сгенерированного регулярным выражением R ». Этот поиск подстроки не является частью самого регулярного выражения; это похоже на цикл вокруг фактического движка регулярных выражений, который пытается сопоставить каждую возможную подстроку с регулярным выражением (и останавливается, когда находит совпадение).
В терминах фундаментальных регулярных выражений создается впечатление, что существует неявный .*
, добавленный до и после вашего шаблона. Когда вы смотрите на это так, ^
и $
просто не позволяют добавлять .*
в начале / конце регулярного выражения.
Кроме того, регулярные выражения (которые обычно используются в программировании) на самом деле не являются «регулярными» в математическом смысле; то есть есть много конструкций, которые не могут быть преобразованы в фундаментальные операции, перечисленные выше. К ним относятся обратные ссылки (\1
, \2
, ...), границы слов (\b
, \<
, \>
), просмотр в будущее / просмотр назад утверждения ((?= )
, (?! )
, (?<= )
, (?<! )
) и другие.
Что касается ε: он не имеет символьного кода, потому что пустая строка является строкой, а не символом. В частности, строка представляет собой последовательность символов, а пустая строка не содержит символов.
^AB
может быть выражен как (εAB)
, т.е. пустая строка, за которой следует AB, и AB$
может быть выражена как (ABε)
, то есть AB, за которой следует пустая строка.
Пустая строка фактически определяется как ''
, это строка длиной 0, поэтому она не имеет значения в таблице ASCII. Однако язык программирования C завершает все строки символом ASCII NULL, хотя это не учитывается в длине строки, которую он все равно должен учитывать при выделении памяти.
< Сильный > ИЗМЕНИТЬ Как отметил @melpomene в своем комментарии, εAB эквивалентно AB, что делает вышеуказанное недействительным. Поговорив с рабочим колледжем, я больше не уверен, как это сделать, и даже если это возможно. Надеюсь, кто-то может придумать ответ.
Похожие вопросы
Связанные вопросы
Новые вопросы
regex
Регулярные выражения предоставляют декларативный язык для сопоставления шаблонов в строках. Они обычно используются для проверки, синтаксического анализа и преобразования строк. Поскольку регулярные выражения не полностью стандартизированы, все вопросы с этим тегом должны также включать тег, определяющий применимый язык программирования или инструмент.