Можно ли проверить, будет ли данное регулярное выражение соответствовать любой строке? В частности, я ищу функцию matchesEverything($regex)
, которая возвращает true, если $regex
будет соответствовать любой строке.Проверьте, будет ли данное регулярное выражение соответствовать чему-либо
Я полагаю, что это эквивалентно запросу: «Если задано регулярное выражение r
, существует ли строка, которая не соответствует r
?» и я не думаю, что это разрешимо, не помещая границы на множество «всех строк». I.e., если я предполагаю, что строки никогда не будут содержать «блаббаль», тогда я могу просто проверить, соответствует ли r
«бла-бла». Но что, если таких границ нет? Мне интересно, можно ли решить эту проблему, если регулярное выражение r
эквивалентно .*
.
Я считаю, что это эквивалентно [Проблема с остановкой] (http://en.wikipedia.org/wiki/Halting_problem). Возможно, не удастся написать алгоритм, чтобы определить, эквивалентно ли произвольное регулярное выражение '. *' –
. Регулярные выражения с обратными ссылками и backrefs, но без интерполяции кода, должны быть подмножеством или равными контекстно-зависимым грамматикам. Решение этих языков не является завершением Тьюринга, поэтому этот вопрос не должен быть эквивалентен проблеме остановки. * Если *, учитывая CSG, мы можем создать строку этого языка, заменив правила, тогда мы можем применить запрещенную подстановку, создав таким образом строку, которая отсутствует на нашем языке. К сожалению, я не знаю, так ли это, и я не смог бы набросать это доказательство. – amon
Это называется «Проблема пустоты» и разрешима для DFA/NFA (т.е. регулярные выражения без обратных ссылок/обратных ссылок). Http://www.cs.miami.edu/~ogihara/csc527/new04-1.pdf Для regexes с backrefs (контекстно-зависимые грамматики), проблема пустоты неразрешима.(Я не могу найти доказательство прямо сейчас, но это часто упоминается в литературе) – rmmh