стили inDesign GREP

У меня есть несколько документов, в которых есть юридические строки для 4 разных стран (Япония, Китай, Макао и арабский язык). Правовая строка состоит по большей части из английских, а затем японских иероглифов, китайских иероглифов и т. д. Например: китайские иероглифы ТМ и © Моя компания. Все права защищены.

Я следил за некоторыми учебниками для двойных шрифтов, используя стили GREP. Для каждой страны я сделал 4 разных стиля персонажей. Каждый со своим назначенным шрифтом. Текстовое поле в документе связано со стилем абзаца, который содержит английский шрифт, который я хотел бы использовать (Arial). Я использую диапазоны Unicode для каждого языка. Например, диапазон китайских CJK: 4E00–9FD5.

Мои стили GREP выглядят следующим образом:

Применить стиль: Макао
к тексту:[\x{4E00}-\x{9FD5}\x{3000}-\x{303F}]+

Применить стиль: Китай
к тексту:[\x{3000}-\x{efff}\x{4E00}-\x{9FD5}\x{3300}-\x{33FF}][^.,;:?!\d]+

Применить стиль: Япония
к тексту:[\x{3040}-\x{309F}\x{30A0}-\x{30FF}\x{FF00}-\x{FFEF}\x{3000}-\x{303F}\x{4E00}-\x{9FD5}]+

Применить стиль: арабский
к тексту:[\x{0600}-\x{06FF}\x{0750}-\x{077F}][^.,;:?!\d]+

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

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

Мне было интересно, есть ли определенный порядок стилей GREP, которому я должен следовать, или я упускаю что-то настолько фундаментальное, чтобы он правильно работал на всех 4 языках.

Почему вы используете разные шрифты для Китая и Макао? Предположительно, они оба написаны на мандаринском диалекте упрощенными буквами, так зачем вообще иметь два разных стиля?

Ответы (1)

Механизм регулярных выражений выбирает первое возможное совпадение. Например, регулярное выражение foo|foo barникогда не будет соответствовать foo barпросто потому, что оно всегда сначала будет соответствовать foo. Посмотрите, как двигатель делает совпадение и продолжает свою работу с этой точки вперед, никогда не оглядываясь назад.

То же самое происходит и со стилями GREP. За исключением того, что это происходит в обратном порядке, поскольку отдельные стили применяются отдельно, и последний в списке имеет приоритет. Таким образом, последний стиль переопределяет другие. Так что просто Китай переопределит Японию, если он ниже Японии в списке, потому что Япония в основном является подмножеством Китая, как вы это сформулировали.

Устранение ваших проблем

Хорошо, так как это исправить? Я не уверен, что это возможно, если оба используют одинаковые диапазоны кандзи! Это не то, в чем grep хорош. Если только вы не можете сделать так, чтобы диапазоны не перекрывались полностью.

Однако ваши выражения GREP почти наверняка неверны. давайте сначала посмотрим на отдельные части

[\x{3000}-\x{efff}\x{4E00}-\x{9FD5}\x{3300}-\x{33FF}]

смотрим 3000 < 3300 < 4E00и EFFF > 9FD5 > 33FFтак это означает, что диапазоны после первого избыточны, и это эквивалентно написанию:

[\x{3000}-\x{efff}]

Это если в движке сопоставления нет ошибок. Во-вторых, вы используете две разные логики сопоставления:

  • шаблон любого количества вещей в диапазоне, используемом Макао и Японией

    [...]+использует эту логику)

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

    [...][^.,;:?!\d]+

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

Попытка исправить это

Как я уже сказал, я не уверен, что это возможно. Вы можете попробовать использовать другую стратегию вместо того, чтобы сопоставлять любое количество вещей в наборе, совпадающем с чем угодно, если это не нарушает набор. Для этого вам нужно использовать просмотр вперед. К сожалению, просмотр вперед не имеет бесконечной ширины, поэтому это может не сработать для вас. По сути, регулярные выражения не подходят для этой работы.

Альтернативная стратегия открывается, если у вас есть какой-то символ или позиция, которые вы можете сопоставить в начале и в конце вашего текста. например, начало абзаца и конец абзаца, тогда вы можете легко сопоставить диапазон, который ДОЛЖЕН начинаться/заканчиваться этим символом, и он будет отбрасывать любые такие вещи, которые содержат что-либо недопустимое.

Итак, скажем, вы хотите сделать это для каждого абзаца. Для простоты тестирования абзац может содержать только строчные буквы ASCII, а также пробел, точку и запятую, тогда они ^[a-z .,]+$будут соответствовать:

the old man sighed but did not answer, and they moved on 
in silence. the surf grew suddenly louder, as they emerged
from the forest upon a stretch of sand dunes bordering the sea. 

но нет

The old man sighed but did not answer, and they moved on 
in silence. The surf grew suddenly louder, as they emerged
from the forest upon a stretch of sand dunes bordering the sea. 

На счет того, что между ними есть недопустимый символ.

PS

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