Це залежить від того, чи маєте ви регулярний вираз чи регулярне вираження: регулярні вирази - це зло, але регулярні вирази - це краса і ніколи не зроблять вас злом.
Під регулярним виразом я маю на увазі сучасний регулярний вираз: тобто регулярний вираз з додатковими сучасними функціями, такими як зворотні посилання - наприклад, регулярний вираз, сумісний з Perl. Це є більш потужним, ніж класичне регулярне вираження з підручника з теорії формальних мов / автоматів, оскільки класичні регулярні вирази не допускають зворотних посилань, пошуку, огляду назад тощо.
Для класичного регулярного вираження, якщо у вас є хороша реалізація для відповідника, то жодне регулярне вираження не є занадто злим. Зокрема, стандартним алгоритмом зіставлення є перетворення регулярного виразу в NFA і потім виконання NFA у рядок введення. Для цього алгоритму найгірший час запуску для тестування рядка -символу - O ( n ) , коли регулярний вираз фіксований. Це означає, що час роботи не може вибухнути занадто швидко. Немає рядка, який би викликав експоненціальне збільшення часу роботи. Таким чином, якщо ви використовуєте математику, яка використовує цей алгоритм, жоден класичний регулярний вираз не буде злим.нO ( n )
Це залежить від реалізації відповідного регулярного виразу. Якщо у вас є наївна або погана реалізація відповідника, то відповідність може зайняти експоненціальний час; безумовно, є алгоритми з цим властивістю. Але найкраща відповідь на це, мабуть, не зміна регулярного виразу; напевно, краще вибрати кращий збірник, якщо вас турбують атаки відмови в обслуговуванні.
Для порівняння, деякі сучасні виразки неминуче злі. Якщо у вас є сучасний регулярний вираз, то відповідність може вимагати експоненціального часу. Зокрема, регулярні вирази з зворотними пересиланнями можуть розпізнавати жорсткі мови NP. Отже, за правдоподібних припущень, існує клас злих регенексів, де тестування на відповідність займає експоненціальний час. Таким чином, деякі сучасні регулярні виразки неминуче злі: немає єдиного можливого способу знайти еквівалентний регулярний вираз, який не спричинить експоненціальний вибух у часі роботи.
(Такий еквівалент може існувати і навіть теоретично підходить до кінця, але, за правдоподібних припущень, пошук еквівалентного регулярного вираження забирає експоненціальний час, що практично неможливо на практиці. Якщо у вас була систематична процедура пошуку еквівалентного регулярного виразів у поліноміальний час , тоді ви могли б вирішити NP-важку проблему за багаточлен, довівши, що P = NP. Це не дуже добре для того, щоб існувати еквівалентний регулярний вираз, якщо немає способу знайти його протягом життя.)
Передумови та джерела:
На яких мовах розпізнають регулярні вирази, сумісні з Perl? та Виразність сучасних регулярних виразів містять посилання на обґрунтування того, що сучасні регулярні виразки можуть розпізнавати жорсткі мови NP.
Як імітувати зворотні спостереження, магістралі та диски ззаду в автоматах з кінцевим станом? і коли регулярний вираз не є регулярним виразом? може бути корисним для розуміння різниці між регулярними виразами та регулярними виразами.
У цій статті від Russ Cox є вдале пояснення двох різних способів побудови відповідного регулярного виразу, і пояснюється, чому час роботи, якщо ви використовуєте правильний алгоритм, лінійний по довжині вхідного рядка (коли регулярний вираз утримується фіксованим і його довжина трактується як константа). Зокрема, алгоритм на основі NFA - також відомий як алгоритм Томпсона - має лінійний час роботи в гіршому випадку. Він також показує, як деякі популярні мови мають реабілітаційні програми, які можуть стати експоненціальними на деяких регулярних виразів, і він обговорює, які аспекти сучасних регулярних виразів можуть вводити експоненціальні часи роботи.
У цій посаді я припускаю P! = NP. Більше того, коли я маю на увазі "правдоподібні припущення", я маю на увазі експоненціальну гіпотезу часу .