2016-12-04 3 views
0

Мне нужен способ проверить, может ли регулярное выражение соответствовать 0 символам, и поэтому соответствует бесконечно. Например, регулярное выражение .* может совпадать с 0 символами, что означает, что он будет работать навсегда, сбой моего приложения.Как проверить регулярное совпадение регулярного выражения?

В моем приложении пользователь вводит регулярное выражение, которое может, конечно, навсегда. Как я могу предотвратить это?

+0

Вы изменить регулярное выражение, чтобы убедиться, что это не '' *?! – Dekel

+0

Но '. *' Не является единственным регулярным выражением, которое будет соответствовать бесконечно. – Zac

+1

Что вы действительно пытаетесь сделать? – Dekel

ответ

1

Нет такого понятия, как регулярное выражение, согласованное бесконечно; таким образом, застревает в бесконечном цикле. В качестве примера, регулярное выражение .* немедленно остановится, когда будет 0 символов, и будет выполняться для n итераций по любой строке n символов.

Регулярное выражение представляет собой форму конечного автомата. Строка, ее вход, также всегда конечна. В регулярных выражениях нет бесконечного.

Вот в один и тот же вопрос, заданный в контексте CS:. https://cs.stackexchange.com/questions/47835/can-a-regular-expression-be-infinite

+0

Вы уверены? Я почти уверен, что это будет цикл навсегда. – Zac

+0

'' Text \ nText2 ".match (новый RegExp (". * ", 'G'))' возвращает '[" Text "," "," Text2 "," "]', насколько я могу видеть. –

+0

Да, я уверен. Регулярное выражение '. *' - это FSM, который будет циклически перебирать каждый элемент в строке до тех пор, пока не будет больше элементов, таким образом, создавая свое согласованное состояние. Поскольку элементов нет, регулярное выражение останавливается немедленно. –

Смежные вопросы