Яке визначення регулярного виразу?


10

Нещодавно я вступив у дружню суперечку з Готі про те, що є регулярним вираженням у коментарях до моєї відповіді на це питання. Я стверджував, що таке регулярне вираження:

`[Rr]eading[Tt]est[Dd]ata`

Ghoti не погодився, стверджуючи, що це файловий глобул. Глоб сторінка на Вікіпедії стверджує , що (курсив мій):

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

Однак цитування цього твердження не існує, що свідчить про те, що це лише певна думка редактора Вікіпедії.

У Єдиній специфікації UNIX ®, версія 2 , зазначено, що базовий регулярний вираз (BRE) може бути навіть одним символом:

Звичайний символ - це BRE, що відповідає самому собі: будь-який символ у підтримуваному наборі символів, за винятком спеціальних символів BRE, перелічених у спеціальних символах BRE.

Отже, яке визначення регулярного виразу у світі * nix, і чи не визначає це визначення глобус файлів?


6
У теоретичному КС регулярний вираз - це опис регулярної мови, яка може бути розпізнана скінченним автоматом. У світі Unix це набагато складніше, і немає єдиного визначення. Є 2 регулярних вирази діалектів в POSIX специфікації: розширені і базові, які використовуються такими інструментами , як grep, sed, і awk. Vim використовує власну різноманітність, як і Perl.
jw013

Отже, за цим визначенням, файловий глобус - BRE правильно?
terdon

2
Ні, файловий глобус НЕ БУДЕ - що змушує вас думати, що це? Якщо ви прочитаєте опис POSIX BRE та POSIX опис глобулінгу, то помітите, що вони не однакові. Наприклад, *має два різних значення у BRE та globs. Примітка. Я не думаю, що термін glob використовується в будь-якій точці специфікації POSIX - він називається узгодження шаблонів, а описаний у розділі мови оболонки.
jw013

Відповіді:


10

Як lk- сказав, варіант буде розглядати аргумент як Glob, а не регулярною вираз.-namefind

Чи інтерпретується рядок як глобус, або регулярний вираз, або просто звичайна рядок, залежить від того, що використовується для інтерпретації. Це питання контексту. Рядок в вашому прикладі, [Rr]eading[Tt]est[Dd]ataможе бути оцінена в ряді різних способів, але що це залежить від того, як ви використовуєте його. Використовуйте його як глобус, це глобус. Використовуйте його як регулярний вираз, це регулярний вираз. У випадку питання, звідки це походить , ОП описав рядок як регулярний вираз. Тому можна припустити, що він планував трактувати це як регулярний вираз.

Один символ може також бути регулярним виразом. Це також може бути струна, а також може бути глобусом. Якщо ви хочете, це може трактуватися як байт або мініатюра. Все залежить від контексту.

Існує ряд специфікацій для регулярних виразів у різних формах. BRE і ERE добре документально підтверджені. PCRE додає багато функціональних можливостей. Багато інтерпретаторів регулярних виразів реалізують, наприклад, "всі ERE та деякі PCRE". Або вони зроблять ERE мінус деяку функцію. Якщо ви працюєте за офіційними специфікаціями, багато хто з інструментів стверджує, що підтримка регулярного виразів, яка виявляється неправильною або неповною. Знаючи деталі, ви можете адаптувати свої рішення до набору функціональних можливостей, доступних у будь-якому інструменті, що оцінює ваш регулярний вираз.

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


7

[Rr]eading[Tt]est[Dd]ataвидається дійсним як глобус, так і регулярний вираз, і я вважаю, що має однакове "значення" в обох трактуваннях. Однак -nameваріант findаргументу трактуватиме як глобус, а не регулярний вираз.

Ця відмінність буде мати значення, якщо ви надаєте такий аргумент, як foo*, що є дійсним глобулом і дійсним регулярним виразом, але має різний зміст залежно від інтерпретації:

Якщо інтерпретувати як шаблон Глоби, це буде відповідати foo, foobar, foo123і т.д.

Якщо інтерпретувати як регулярний вираз, це буде відповідати fo, foo, fooooooі т.д.


Дякую, я бачу різницю між глобальним малюнком і регулярним виразом. Яке формальне визначення регулярного вираження?
тердон

1
Я не знаю, чи існує єдине визначення для "регулярних виразів", оскільки цей термін зазвичай використовується. Існують різні специфікації синтаксису, такі як регулярні вирази POSIX або регулярні вирази Perl, які включають інші "особливості", такі як зворотні посилання або lookaheads. Це можуть бути вже не регулярні вирази в найсуворішому сенсі (в контексті регулярних формальних мов), але все ще називаються такими.
lk-
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.