Регулярні вирази - ні


36

Запитайте навіть у когось із досвіду інформатики, що таке регулярне вираження, і відповідь, ймовірно, вийде за межі обмеження бути в межах досяжності автоматики з кінцевими станами.

Наприклад, "регулярний вираз"

/^1?$|^(11+?)\1+$/

створений відомою особистістю Perl Abigail (і частина тестового набору Perl з 2002 року) описує машину, яка приймає лише складені одинарні числа, але вправа 4.5 (b) у третьому виданні « Вступ до формальних мов та автоматів » Пітера Лінца використовує читача насосне лемму довести , що

L={an:n is not a prime number}

не є звичайною мовою.

У контекстах, де важливим є розрізнення, що слід назвати суворо більш сильними виразами?

Відповіді:


46

Ларрі Уолл запропонував використовувати "регулярний вираз" для запропонованого Kleene формалізму, і "регулярний вираз" для виразів для широко використовуваних розширень. Це досить широко дотримується конвенція. Якщо ви хочете дати зрозуміти, що ви говорите про регулярні вирази в сенсі формальних мов, зазвичай це не важко перевести на розмови звичайних мов.

Потужність регулярних виразів відбувається завдяки зворотному відстеженню, і на автоматах для звичайних мов із зворотним відстеженням проводиться робота. Див., Зокрема, Becchi & Crowley, 2008, розширення кінцевих автоматів для ефективного відповідності Perl-сумісним регулярним виразам .


5
Я погоджуюся, щось на кшталт "regex Perl" ("POSIX regex" тощо) проти "звичайної мови" повинно бути достатньо зрозумілим, щоб запобігти будь-якій можливості неправильного тлумачення.
Jukka Suomela

Регекси Perl мають набагато більше додаткових функцій, ніж просто зволікання.
reinierpost

@reinierpost Правда, але я вважаю, що зворотний трек є найважливішим з точки зору формальної мови. Регекси Perl мають такі функції, як виконання довільного коду Perl, але я думаю, що регулярні виразки слід інтерпретувати як те, що охоплюють PCRE. PCRE містять такі дивацтва, як рекурсивні візерунки, але це темні мистецтва, що виводять вас далеко за межі звичайних мов. Я міг би оновити свою відповідь, щоб висвітлити ці проблеми.
Чарльз Стюарт

18

Ці вирази були вивчені Ахо (Підручник з теоретичної інформатики, т. А, гл. 5) та Кампеану, Саломаа, Ю ("Офіційне вивчення практичних регулярних виразів", Міжнародний журнал фундаментів інформатики, 14: 1007 –1018, 2003), а також деякі подальші документи.

Ахо називає більш потужні вирази "rewbr" (регулярний вираз із зворотними посиланнями), Campeanu та ін. використовувати "розширене регулярне вираження", а також "практичне регулярне вираження". Як здається, "розширений регулярний вираз" - це термін, який найчастіше використовується в останній літературі.

Спираючись на термін "раціональне вираження" з французької школи, і враховуючи той факт, що ці вирази використовуються в реальному світі, мені сама подобається "реальне вираження".

Додаток: Розділ моєї кандидатської дисертації стосується цього класу формальних мов (відповідний документ повинен з’явитися на STACS 2011). Під час написання цієї глави та статті я експериментував з різними термінами. Нарешті, я вирішив використовувати розширені регулярні вирази для моделі із зворотними перевагами, а правильні регулярні вирази - для приємних та нормальних регулярних виразів. Оскільки досить прикро міняти термінологію в документі, який вже повністю (або в основному) написаний, я думаю, що когось може зацікавити досвід, який призвів до мого вибору:

По-перше, регулярні вирази та перемотування не справді перекочують язик, і їх використання знову і знову протягом цілого паперу стає справді стомлюючим для написання та читання, зокрема при використанні будь-якої з можливих форм множини. PERL-подібні регулярні вирази також були досить непростими. Звичайно, я не є носієм мови, тому YMMV.

По-друге, як тільки хочеться поговорити про обидві моделі, зручно використовувати терміни, які є варіацією регулярного вираження , оскільки це дозволяє підкреслити схожість або відмінності за потребою (наприклад, "регулярний вираз, будь то правильний чи розширений "). Крім того, це дозволяє легко підкреслити окремий випадок "розширених регулярних виразів без зворотних посилань", коли мова йде про особливі випадки у всьому класі, замість порівняння різних моделей.

По-третє, я віддав перевагу використанню терміна, який уже використовується в літературі протягом нещодавно складеного терміна, який залишив мені вибір між розширеними регулярними виразами та практичними регулярними виразами . Другий вибір мав на увазі (принаймні неявно), що правильні регулярні вирази якимось чином непрактичні, що виглядало досить дивно (особливо, оскільки RE2 Google не використовує зворотній зв'язок і видається цілком практичним).

Звичайно, цей вибір є лише моїм "особистим місцевим максимумом", і залежно від потреб, інші варіанти можуть бути більш доречними.


7
На жаль, термін розширений регулярний вираз вже прийнятий POSIX, який розрізняє базовий регулярний вираз (BRE) і розширений регулярний вираз (ERE) , обидва з яких є розширеними регулярними виразами відповідно до вашого визначення.
Йорг W Міттаг

@ Йорг: Насправді відповідно до цього ні розширені, ні основні POSIX регулярні вирази не є більш потужними, ніж регулярні регулярні вирази. І чистий (не GNU) BRE здається насправді менш потужним, ніж регулярні вирази (відсутній оператор чергування).
sepp2k

Дивіться "Про розширені регулярні вирази" Карла та Нарендрана (2009) для останніх результатів щодо цього "rewbr": portal.acm.org/citation.cfm?id=1533235
Якоб

Подальші останні результати щодо цього мовного класу: "Про перетин мов регулярних виразів з регулярними мовами" Кампеану та Сантея (TCS 410, 2009) "Тест відповідності поліноміального часу для великих класів розширених регулярних виразів" Рейденбаха та Шміда (CIAA 2010 ), і "Розширені регулярні вирази: Успішність та рішучість" (я вважаю, що має з'явитися в STACS 2011).
Домінік Д. Фрейденбергер

6

Відомо, що так званий регулярний вираз perl є досить потужним, щоб бути Тьюрінгом повним; є навіть компілятор від звичайної програми до perl regexp.

Тому я сумніваюся, що є сенс шукати назву для цього виду "регулярних виразів".

Шукайте, наприклад, http://search.cpan.org/~asavige/Acme-EyeDrops-1.62/lib/Acme/EyeDrops.pm


У вас є якісь покажчики?
Андрас Саламон

5
@ András: Я думаю, що Артур говорить про ?{CODE}директиву Perl , яка дозволяє виразним шаблонам переплутати програмний код у регулярні вирази. Я розумію, що PCRE зазвичай визначаються як "декларативна" частина мови, а вся мова називається мовою візерунка. За даними WP, Aho, 1990, "Алгоритми пошуку шаблонів у рядках" показують, що проблема членства для звичайних мов із зворотним відстеженням не є повною. Інших важких особливостей для декларативних PCRE немає.
Чарльз Стюарт

Я додав посилання; Я не дивився на вихідний код, тому я не знаю, як це працює, і якщо є якісь докази того, що компіляція справді правильна.
Артур МІЛЬХІОР

1
Вибачте, але, згідно з вашим аргументом, оскільки лямбда-обчислення є повним Тьюрінгом, не було сенсу шукати його ім’я. Те саме для всіх обчислювальних формалізмів і мов Тюрінга. Більш суттєво, Тьюрінг-повнота не описує, наскільки виразною є мова, тому немає сенсу ідентифікувати мови лише тому, що вони є Тьюрінгом. Звичайно, мій приклад щодо лямбда-числення був надзвичайним.
Blaisorblade

2

Я вважаю, що найкращим терміном для "регулярного вираження в контексті автоматів" є "раціональне вираження", як воно використовується, скажімо, в "Елементах теорії автоматів" Сакаровича або "Довідник зважених автоматів".


1
Не дуже часто використовується, ІМХО.
Blaisorblade

Він / широко використовується в теорії зважених автоматів, див. En.wikipedia.org/wiki/Rational_language . Я бачив це дуже багато разів у сфері мов і над групами.
Michaël Cadilhac

1

З огляду на інші відповіді, я б запропонував, що "регулярні мови" є безпечними, і, коротко зазначивши різницю, поговорити про "практичні регулярні вирази" для регулярних виразів (з зворотним відстеженням).

Також зауважимо, що той самий регулярний вираз, як регулярний вираз і як практичний, може мати різну семантику, оскільки в останньому випадку семантика визначається терміном зворотного відстеження з різними результатами. Деталі будуть поза темою, але я відповім, якщо ви задасте інше питання з цього приводу (можливо, так, а не тут, не знаю) і повідомте мене через коментар.


0

Ми можемо назвати їх виразними візерунками . Це може спричинити плутанину з мовами шаблонів, але, принаймні, вони є менш поширеними.


2
В принципі, я згоден з міркуваннями, але Campeanu, Santean, Ю. вже використовували термін вираз шаблонів для позначення подібного класу мов з визначенням «чистого» (див «шаблонні вирази і шаблоном автоматів», IPL 92 (2004 ).
Домінік Д. Фрейденбергер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.