m0nkrus
24-06-2011, 11:33
Подоплека: Имеем программу Lingvo. Это мультиязычный словарь. Разработчики решили выпендриться и принудительно в разделы двуязычного направления перевода положили одноязычные словари. То есть, в разделе Ru->En лежат не только Ru-En-словари, но и Ru-Ru, и т.д. Это раздражает, поскольку хочешь получить перевод, а кроме него еще получаешь толкование слова, хотя этого не заказывал. Так вот, нужно автоматом убрать одноязычные словари из двуязычных разделов, независимо от того, какие и в каком количестве словари в этих разделах расположены.
Чтобы было понятно, я для начала приведу сильно упрощенный вариант INI-файла, с которым предстоит работать:
[Group:1049-1033]
AllDictionaries=AmericanEnglish (Ru-En);UrbanDictionary (Ru-Ru)
[Group:1049-1049]
AllDictionaries=UrbanDictionary (Ru-Ru)
Задача: Для раздела Group, у которого цифровой код различается (1049-1033 - различие, 1049-1049 - идентичный), в строке AllDictionaries нужно избавиться от подстроки с именем словаря, у которой в скобках совпадает буквенный код (Ru-Ru - совпадение, Ru-En - различие).
Постоянные элементы: Group, AllDictionaries, разделитель ";", разделители "(" и ")"; строка AllDictionaries идет сразу за строкой Group
Переменные элементы: 1049-1033 - цифры в строке могут быть любыми, так как групп много; UrbanDictionary - может быть любым, (Ru-Ru) - буквенная часть может быть любой.
Механизм должен быть примерно следующим:
- Ищем строку, начинающуюся с "[Group:"
- Проверяем, чтобы подстрока от ":" до "-" не совпадала с подстрокой от "-" до "]"
- Если совпадает, то ищем следующую строку, начинающуюся с "[Group:". А если не совпадает, то начинаем анализ строки, начинающейся с "AllDictionaries=", расположенной сразу под строкой "[Group:"
- В строке "AllDictionaries=" ищем подстроку, ограниченную скобками "(" и ")" и в ней проверяем, чтобы подстрока от "(" до "-" не совпадала с подстрокой от "-" до ")"
- Если нет совпадения, то переходим к поиску следующей подстроки, ограниченной скобками "(" и ")", в строке "AllDictionaries=". А если совпадение есть, то удаляем подстроку, включающую проверенные элементы и ограниченную либо "=" и ";", либо ";" и ";", либо ";" и символом конца строки. Здесь нужно быть аккуратным, чтобы случайно не удалить несколько подстрок с именами словарей от "=" до ";" или от ";" до символа конца строки.
- Продолжаем поиск, проверку и удаление (если нужно) подстрок в строке "AllDictionaries=" с использованием шаблона выше.
- Как только оказались проверенными и переработанными все подстроки в строке "AllDictionaries=", начинаем искать следующую строку, начинающуюся с "[Group:", где все повторяем заново. И так до конца файла.
Чтобы было понятно, я для начала приведу сильно упрощенный вариант INI-файла, с которым предстоит работать:
[Group:1049-1033]
AllDictionaries=AmericanEnglish (Ru-En);UrbanDictionary (Ru-Ru)
[Group:1049-1049]
AllDictionaries=UrbanDictionary (Ru-Ru)
Задача: Для раздела Group, у которого цифровой код различается (1049-1033 - различие, 1049-1049 - идентичный), в строке AllDictionaries нужно избавиться от подстроки с именем словаря, у которой в скобках совпадает буквенный код (Ru-Ru - совпадение, Ru-En - различие).
Постоянные элементы: Group, AllDictionaries, разделитель ";", разделители "(" и ")"; строка AllDictionaries идет сразу за строкой Group
Переменные элементы: 1049-1033 - цифры в строке могут быть любыми, так как групп много; UrbanDictionary - может быть любым, (Ru-Ru) - буквенная часть может быть любой.
Механизм должен быть примерно следующим:
- Ищем строку, начинающуюся с "[Group:"
- Проверяем, чтобы подстрока от ":" до "-" не совпадала с подстрокой от "-" до "]"
- Если совпадает, то ищем следующую строку, начинающуюся с "[Group:". А если не совпадает, то начинаем анализ строки, начинающейся с "AllDictionaries=", расположенной сразу под строкой "[Group:"
- В строке "AllDictionaries=" ищем подстроку, ограниченную скобками "(" и ")" и в ней проверяем, чтобы подстрока от "(" до "-" не совпадала с подстрокой от "-" до ")"
- Если нет совпадения, то переходим к поиску следующей подстроки, ограниченной скобками "(" и ")", в строке "AllDictionaries=". А если совпадение есть, то удаляем подстроку, включающую проверенные элементы и ограниченную либо "=" и ";", либо ";" и ";", либо ";" и символом конца строки. Здесь нужно быть аккуратным, чтобы случайно не удалить несколько подстрок с именами словарей от "=" до ";" или от ";" до символа конца строки.
- Продолжаем поиск, проверку и удаление (если нужно) подстрок в строке "AllDictionaries=" с использованием шаблона выше.
- Как только оказались проверенными и переработанными все подстроки в строке "AllDictionaries=", начинаем искать следующую строку, начинающуюся с "[Group:", где все повторяем заново. И так до конца файла.