Разбор на INI файлове
Разбор на INI файлове
В края на главата ще разгледаме проблем с използване на регулярни изрази. Представете си, че пишем програма, която автоматично събира информация за нашите врагове чрез интернет. (Няма да пишем цялата програма, а само частта, която чете файла с настройките. Съжаляваме.) Файлът изглежда така:
Точният формат на файла (който е доста широко използван и обикновено наричан INI) е както следва:
• Празните редове и редовете, започващи с точка и запетая, се игнорират.
• Редовете, оградени в квадратни скоби, започват нов раздел.
• Редове, съдържащи буквено-цифров идентификатор, последван от =, добавят настройка към този раздел.
• Всичко останало са неверни данни.
Нашата задача е да преобразуваме такъв низ в масив от обекти, всеки със свойство име и масив от настройки. Всеки раздел се нуждае от един обект и още един за глобални настройки в горната част на файла.
Тъй като файлът трябва да се анализира ред по ред, добра идея е да започнете, като разделите файла на редове. За да направим това, използвахме string.split("n") в глава 6. Някои операционни системи използват не един знак n за подаване на ред, а два - rn. Тъй като методът на разделяне приема регулярни изрази като аргумент, можем да разделяме редове с помощта на израза /r?n/, като позволяваме и единични n и rn между редовете.
функция parseINI(низ) // Да започнем с обект, съдържащ настройки от най-високо ниво var currentSection = ; varcategories = [currentSection]; string.split(/r?n/).forEach(function(line) var match; if (/^s*(;.*)?$/.test(line)) return; > else if (match = line.match(/^[(.*)]$/)) currentSection = ; categories.push(currentSection); > else if (match = line.(/^( w+)=( .*)$/)) currentSection.fields.push( стойност: мач[2]>); > else throw new Error("Line '" + line + "' contains invalid data."); > >); връщане на категории; >