RegEx и многострочные PO-файлы - PullRequest
0 голосов
/ 12 октября 2018

Я пытаюсь создать регулярное выражение в Notepad ++, просто поиск и замена.

Строки следующие:

msgid ""

"CONSUMPTION_PLAN_ERR | Спецификация готового товара была изменена с момента добавления производства. \ N "

" Чтобы продолжить использовать это задание с новой спецификацией, обновите лоты и срок действия. \ N "

"Предыдущие производственные записи не будут обновляться. \ N "

msgstr" "

" Спецификация готового товара была изменена с момента добавления производства. \ N "

" Кпродолжайте использовать это задание с новой спецификацией, обновите лоты и срок действия. \ n "

" Предыдущие производственные записи не будут обновлены. \ n "

Мне нужно изменитьдвойные кавычки, но только в части сообщения.Эти двойные кавычки должны быть изменены на символы меньше <и больше>, поэтому результат будет следующим:

msgid <>

<Чтобы продолжить использовать это задание с новой спецификацией, обновите лоты и срок действия. \ n>

<Предыдущие производственные записи не будутобновлено. \ n>

msgstr ""

"Спецификация готового изделия была изменена с момента добавления производства. \ n"

"Чтобы продолжить использовать это задание сновая спецификация, обновите лоты и срок действия. \ n "

" Предыдущие производственные записи не будут обновлены. \ n "

Мне понадобится шаблон регулярных выражений, который соответствует многострочным примерам, таким каквыше, независимо от того, сколько строк нужно изменить.

Я использовал этот шаблон для поиска:

msgid ""\r\n("(.+?)"\r\n){1,}

И этот шаблон для замены:

msgid <>\r\n<\2>\r\n

Который работает несколько, но не совсем то, что я хотел.Он копирует только последнюю строку, но не две над ней.Я делаю что-то не так, но не знаю, что это такое.

Предложения?

1 Ответ

0 голосов
/ 12 октября 2018

Вы можете использовать регулярные выражения, но это не просто и не будет эффективным.Более эффективное решение - написать синтаксический анализатор или использовать более гибкий язык программирования, чтобы использовать комбинацию как минимум из двух регулярных выражений: один извлечет блок, а второй заменит кавычки.

Одно регулярное выражениерешение будет выглядеть так:

Find What : (?s)(?:\G(?!^(?<=.))|^msgid)(?:(?!^msg(?:id|str))[^"])*?\K"((?:(?!^msg(?:id|str))[^"])*?)" Заменить на : <$1>

См. Демоверсию regex .

Подробности

  • (?s) - то же, что . соответствует символу новой строки при ВКЛ
  • (?:\G(?!^(?<=.))|^msgid) - начало строки (^) и затем msgid или (|) конец предыдущего успешного совпадения (\G(?!^(?<=.)))
  • (?:(?!^msg(?:id|str))[^"])*?
  • \K - оператор сброса совпадения, буфер совпадений очищается
  • "- a "
  • ((?:(?!^msg(?:id|str))[^"])*?) - Группа захвата 1:
    • (?:(?!^msg(?:id|str))[^"])*? - любой 0 или более, но как можно меньше, вхождений любого символа, кроме ",который не запускает последовательности символов msgid или msgstr в начале строки
  • " - ".

enter image description here

...