Регулярні вирази не можуть ідентифікувати рекурсивні структури . Це основне обмеження.
Візьміть JSON - це досить простий формат, але оскільки об’єкт може містити інші об'єкти як значення членів (довільно глибокі), синтаксис є рекурсивним і не може бути розбитий регулярним виразом. З іншого боку, CSV може бути проаналізований регулярними виразами, оскільки він не містить рекурсивних структур.
Коротше кажучи, регулярні вирази не дозволяють шаблону посилатися на себе. Ви не можете сказати: у цей момент синтаксис знову відповідає всій схемі. Інакше кажучи, регулярні вирази відповідають лише лінійно, він не містить стека, який би дозволив відстежувати, наскільки глибоко це вкладений шаблон.
Зауважте, це не має нічого спільного з тим, наскільки складним чи перекрученим є формат. S-вирази дійсно дуже прості, але їх неможливо розібрати за допомогою регулярного вираження. CSS2, з іншого боку, є досить складною мовою, але не містить рекурсивних структур і для цього може бути розібраний з регулярним виразом. (Хоча це не вірно для CSS3 через вирази CSS, які мають рекурсивний синтаксис.)
Так це не тому, що це некрасиво або складно або схильно до помилок аналізувати HTML, використовуючи лише регулярний вираз. Це так, що це просто неможливо .
Якщо вам потрібно проаналізувати формат, який містить рекурсивні структури, вам потрібно хоча б доповнити використання регулярних виразів стеком, щоб відстежувати рівень рекурсивних структур. Як правило, це працює аналізатор. Регулярні вирази використовуються для розпізнавання "лінійних" частин, а спеціальний код за межами регулярного вираження використовується для відстеження вкладених структур.
Зазвичай такий аналіз розбивається на окремі фази. Токенізація - це перша фаза, де регулярні вирази використовуються для поділу введення на послідовність "лексем", таких як слова, пунктуація, дужки тощо. Розбір - наступна фаза, де ці лексеми розбираються в ієрархічну структуру, синтаксичне дерево.
Отож, коли ви чуєте, що HTML або C # не можна розбирати за допомогою регулярних виразів, пам’ятайте, що регулярні вирази все ще є важливою частиною аналізаторів. Ви просто не можете розбирати таку мову, використовуючи лише регулярні вирази та без допоміжного коду.