Я намагаюся знайти краще рішення для розбору парних знаменитих форматів файлів, таких як: EDIFACT та TRADACOMS .
Якщо ви не знайомі з цими стандартами, перегляньте цей приклад з Вікіпедії:
Нижче див. Приклад повідомлення EDIFACT, яке використовується для відповіді на запит про доступність продукту: -
UNA:+.? '
UNB+IATB:1+6XPPC+LHPPC+940101:0950+1'
UNH+1+PAORES:93:1:IA'
MSG+1:45'
IFT+3+XYZCOMPANY AVAILABILITY'
ERC+A7V:1:AMD'
IFT+3+NO MORE FLIGHTS'
ODI'
TVL+240493:1000::1220+FRA+JFK+DL+400+C'
PDI++C:3+Y::3+F::1'
APD+714C:0:::6++++++6X'
TVL+240493:1740::2030+JFK+MIA+DL+081+C'
PDI++C:4'
APD+EM2:0:130::6+++++++DA'
UNT+13+1'
UNZ+1+1'
Сегмент UNA необов’язковий. Якщо він присутній, він вказує спеціальні символи, які слід використовувати для інтерпретації залишків повідомлення. У цьому порядку підписано шість символів:
- роздільник компонентів даних (у цьому прикладі)
- роздільник елементів даних (+ у цьому зразку)
- десяткове повідомлення (у цьому зразку)
- символ випуску (? у цьому зразку)
- зарезервовано, повинно бути пробіл
- термінатор сегмента ('у цьому прикладі)
Як ви бачите, це лише деякі дані, відформатовані особливим чином, очікуючи їх розбору (подібно до файлів XML ).
Тепер моя система побудована на PHP, і мені вдалося створити аналізатор, використовуючи регулярні вирази для кожного сегменту, але проблема полягає не в тому, що всі реалізують стандарт ідеально.
Деякі постачальники схильні повністю ігнорувати необов'язкові сегменти та поля. Інші можуть вирішити надіслати більше даних, ніж інші. Ось чому я був змушений створити валідатори для сегментів та полів, щоб перевірити, чи файл був правильним чи ні.
Ви можете уявити собі кошмар регулярних виразів, які я зараз маю. Крім того, кожен постачальник потребує багатьох модифікацій регулярних виразів, які я схильний створювати аналізатор для кожного постачальника.
Запитання:
1- Це найкраща практика для розбору файлів (з використанням регулярних виразів)?
2- Чи є краще рішення для розбору файлів (можливо, є готові рішення там)? Чи вдасться показати, який сегмент відсутній або файл пошкоджений?
3- Якщо мені доведеться все-таки створити свій аналізатор, яку модель дизайну чи методологію я повинен використовувати?
Примітки:
Я десь читав про yacc та ANTLR, але не знаю, відповідають вони моїм потребам чи ні!