Есть ли какое-либо регулярное выражение, которое будет для некоторой строки ввода искать совпадение навсегда?
Все регулярные выражения останавливаются?
Ответ 1
Для конечного ввода формального регулярного выражения не остановится.
Любое формальное регулярное выражение может быть переведено в детерминированные конечные автоматы. DFA считывает входной символ за раз, а в конце ввода вы либо принимаете, либо не принимаете. Если состояние принимает, то вход соответствует регулярному выражению. В противном случае это не так.
Теперь большинство библиотек "регулярного выражения" поддерживают вещи, которые не являются регулярными выражениями, такими как обратные ссылки. Пока вы держитесь подальше от этих функций и имеете конечный ввод, вам гарантируется остановка. Если вы не... в зависимости от того, что вы используете, вам, возможно, не гарантируется остановка. Perl позволяет вставлять произвольный код, например, и произвольно, эквивалентный код turing-machine не может быть остановлен.
Теперь, если вход бесконечен, можно найти тривиальные регулярные выражения, которые никогда не остановятся. Например, ".*
".
Ответ 2
Формальное регулярное выражение на самом деле является методом описания детерминированного конечного автомата для разбора строк. Регулярное выражение "соответствует", если DFA завершается в принимающем состоянии в конце ввода. Поскольку DFA считывает свой вход последовательно, он всегда будет останавливаться, когда он достигнет конца ввода, и есть ли совпадение - это просто вопрос изучения того, в каком состоянии DFA он останавливается.
Согласование подстроки фактически одинаково, за исключением того, что вместо того, чтобы принудительно останавливаться в конце одного прочтения строки, DFA вместо этого будет принудительно останавливаться после прочтения каждой возможной подстроки один раз - все же конечный случай. (Да, большинство механизмов регулярных выражений реализуют это немного более оптимизированным образом, чем просто бросать все возможные подстроки в DFA, но концептуально это ограничение все еще существует).
Таким образом, единственный возможный случай, когда DFA не останавливается, - это если вход был бесконечным, что обычно рассматривается за пределами проблемы остановки.
Ответ 3
Я предполагаю, что невозможно найти регулярное выражение, которое не останавливается.
Размер вашего ввода ограничен. Максимальный размер любой согласованной подгруппы регулярного выражения составляет, max, размер вашего ввода.
Если используемый алгоритм не является довольно глупым (переходя несколько раз несколько раз), число соответственных подгрупп тоже будет конечным.
Итак, он будет остановлен.
Ответ 4
Не в том смысле, в котором вы описываете, у вас могут быть очень неэффективные регулярные выражения, которые занимают множество ресурсов и в конечном итоге убивают механизм регулярных выражений, это не то же самое, что останавливать.
Я не думаю, что прекращение действительно применяется здесь, как так прокомментировали другие комментаторы этого сообщения. http://en.wikipedia.org/wiki/Halting_problem
Ответ 5
В соответствии с этим вопросом каждое регулярное выражение останавливается.
Ответ 6
Я не могу представить строку ввода, которая будет анализироваться навсегда, хотя бесконечно длинная строка будет анализироваться навсегда. Учитывая, что регулярное выражение может описывать регулярный язык, который потенциально представляет собой бесконечное множество слов, тогда регулярное выражение может описывать язык бесконечных слов, включая слова бесконечной длины. Однако никакая входная строка не может быть бесконечно длинной, поэтому в какой-то момент она должна была бы остановиться.
Например, если a * b принят на языке, и у вас бесконечно длинная строка 'a', то да, регулярное выражение никогда не остановится. Практически, однако, это невозможно.
Ответ 7
Да.
Регулярное выражение может быть представлено конечным автоматом. Каждый раз, когда вы получаете атомный ввод, это приведет к тому, что любой четко определенный FSM перейдет в известное состояние.
Исключение - это когда у вас бесконечный ввод, но это не применимо к проблеме остановки, потому что он имеет дело с конечным вводом. Когда у вас конечный конечный автомат и конечный вход, всегда можно определить, остановится ли ваша машина или нет.
Ответ 8
+1 для ответа Даниэля: все конечные входы вызывают истинное регулярное выражение (т.е. без обратных ссылок или других функций без регулярных выражений), и regex эквивалентны DFA.
Бонус: регулярное соответствие выражений может быть простым и быстрым (но медленный в Java, Perl, PHP, Python, Ruby,...)
http://swtch.com/~rsc/regexp/regexp1.html
Обратите внимание, что два графика в верхней части статьи имеют разную шкалу по оси y: одна секунда, другая - микросекунды!