Следующее регулярное выражение позволит вам сравнить два проекта с разметкой божественного имени \nd …\nd* в Paratext Find, используя Remove From List, чтобы увидеть, где количество вхождений в стихах различается. Настройки должны быть без каких-либо ограничений. Это не будет работать, если отмечено Match Only in Verse Text.
regex:(?<=\\v\s\S+\s)((?!\\(v|m?s|nd)).)*(\\nd [^\\]*?\\nd\*)){1,1}((?!\\(v|m?s|nd|c)).)*(?=\\(v|s|c)|\Z)
Это регулярное выражение позволяет находить стихи с заданным количеством диапазонов \nd в тексте:
- {1,1} ровно один
- {1} ровно один (то же, что и выше)
- {2,} два или более
- {0,0} Нисколько
Оно не находит разметку \nd в заголовках разделов и не находит разметку \+nd
Проблемы
- Поскольку оно не находит разметку \+nd, оно не находит \+nd в обычном тексте (редко).
- Оно не находит \nd в частичном стихе, который следует за заголовком раздела (редко).
Следующее регулярное выражение находит txt в диапазонах \+nd …\+nd* в обычном тексте и сносках: .
regex:(?<=\\v\s\S+\s)(((?!\\(v|m?s|\+nd)).)*(\\\+?nd [^\\]*?\\\+?nd\*)){1,1}((?!\\(v|m?s|\+nd)).)*(?=\\(v|m?s)|\Z)
Проблемы
- Поскольку оно находит разметку \+nd, оно находит \+nd в сносках (часто).
Если мы хотим использовать это для сравнения английского перевода, использующего разметку \nd, с переводом, использующим уникальное немаркированное слово для YHWH, мы можем добавить это слово в поиск. Для французского языка мы будем искать Eternel
regex:(?<=\\v\s\S+\s)(((?!\\(v|m?s|nd)|Eternel).)*(\\\+?nd [^\\]*?\\\+?nd\*|Eternel)){1,1}((?!\\(v|m?s|nd)|Eternel).)*(?=\\v|m?s)|\Z)
Поскольку Eternel также встречается в сносках, мы хотим пропустить поиск текста в сносках. Следующая схема позволит вам пропустить текст (такой как диапазон сноски) при сопоставлении:
schema:(?<=<start>)(((?!<selector>).)*((<skipSpan>((?!<selector>).)*)*<requiredSpan>)){Min,Max}((?!<selector>).)*(<skipSpan>((?!<selector>).)*)*(?=<end>|\Z)
Для <selector> см.: Regex Examples: Matching Whole Lines of Text That Satisfy Certain Requirements
Если ваше условие состоит в том, что строка не должна содержать что-то, используйте отрицательный просмотр вперед. ^((?!regexp).)*$ сопоставляет полную строку, которая не соответствует regexp.
Давайте применим это к пропуску текста в сносках. Нам необходимо сопоставить диапазоны \nd и \+nd и Eternel:
<start> \\v\s\S+\s ; Start at verse
<end> \\(v|m?s) ; End at verse or section heading
<end>|\Z \\(v|m?s)|\Z ; For final context add \Z to select end of Chapter
<requiredStart> \\\+?nd|Eternel ; \nd markup optionally embedded and "Eternel"
<requiredSpan> (\\\+?nd [^\\]*?\\\+?nd\*|Eternel) ; The entire \nd phrase or "Eternel"
<skipStart> \\f\s ; Beginning of a footnote
<skipSpan> (\\f\s((?!\\f\*).)*\\f\*) ; The entire footnote
<selector> <end>|<skipStart>|<requiredStart> ; Combine all of the selection restrictions
=> \\(v|m?s)|\\f\s|\\\+?ndEternel ; which simplifies to
=> \\(v|m?s|f\s|\+?nd)|Eternel
Полное регулярное выражение:
regex:(?<=\\v\s\S+\s)(((?!\\(v|m?s|f\s|\+?nd)|Eternel).)*(((\\f\s((?!\\f\*).)*\\f\*)((?!\\(v|m?s|f\s|\+?nd)|Eternel).)*)*(\\\+?nd[^\\]*?\\\+?nd\*|Eternel))){1,1}((?!\\(v|m?s|f\s|\+?nd)|Eternel).)*((\\f\s([^\\]|\\(?!f\*))*\\f\*)((?!\\(v|m?s|f\s|\+?nd)|Eternel).)*)*(?=(\\(v|m?s))|\Z)