QWERTYASDF писал(а): ↑30.04.2016 10:24
Хорошо, тогда что такое вообще "регулярное выражение"? То, что это язык составления текстового шаблона для поиска некоего текста - очевидно и так. Но если чуть углубиться, то выясняется, что языков-диалектов этих довольно много, и что есть задачи поиска текста, которые решаются только несколькими из них, да еще и с изрядной долей непредсказуемости. Причем про такие задачи пишут, что они вообще не решаются РВ как таковыми, и те подходящие для их решения диалекты - это соответственно не РВ, если строго говорить. Вот мне и захотелось понять все-таки - что такое регулярные выражения.
Строгое определение регулярных выражений даётся через определение упомянутых вами регулярных грамматик. Но если вы не хотите лезть в математические дебри, то удобнее просто описать, какие возможности ему соответствуют, а какие - нет.
В регулярном выражении допустимы:
* "" - пустая строка, обозначающая саму себя.
* "a" - простой символ, обозначающий сам себя.
* "AB" - конкатенация двух выражений
* "A|B" - два альтернативных друг другу выражения
* "A*" - 0 или более повторений выражения A (в разных повторениях оно может обозначать разный текст)
Все остальные возможности либо являются просто синтаксическим сахаром, сводимым к вышеупомянутым возможностям, либо запрещены в настоящих, соответствующих формальному определению, регулярных выражениях. Например, "[abc]" - то же, что "(a|b|c)", а "A?" - то же, что "(A|)". Это просто синтаксический сахар, и, соответственно, допустимо. А вот, например, обратные ссылки к вышеуказанным возможностям свести нельзя.
Но на практике всё, что выглядит как регулярное выражение и крякает как регулярное выражение, называют
уткойрегулярным выражением, даже если формально оно таковым не является.