Я пытаюсь совместить пять подстрок в каждом блоке текста (всего 100 блоков).
Я сопоставляю 99% блоков текста, но с несколькими ошибками в отношении групп 3 и 4.
Вот демонстрационная ссылка: https://regex101.com/r/cW2Is3/4
Группа 3 – «части речи», а группа 4 – английский перевод.
В первом блоке текста det, pro
должны быть в группе 3, а затем the; him, her, it, them
the; him, her, it, them
должны быть в группе 4.
Такая же проблема возникает и в третьем блоке текста.
Группа 3 должна быть adj, det, nm, pro
и Group 4 должна быть a, an, one
.
Это моя модель:
([0-9]+)\s+(\w+(?:, \w+)?)\s+(\N+?)\s+(\H.+).*?\r?\n•\s+([\s\S]*?)\s+[0-9]+\s\|.*\s*
Voici …
/^(\d+) +(\w+) +([acdefijlmnoprtv()]+(?:, ?[acdefijlmnoprtv()]+)*) +([\S\s]+?)\n\x{2022} +([\S\s]+?)\n\d+ \| [-\dn]+\s*/gum
Демо-ссылка
Я сделал все возможное, чтобы оптимизировать шаблон. Я побрил почти 10 000 шагов от вашей картины и достиг 100 матчей по желанию.
^
используется для идентификации начала каждого блока (эффективность / точность) \d
используется вместо [0-9]
(Brevity) \s
заменяется буквальным пространством, где это применимо (Brevity) \w
для группы захвата 3. (Эффективность) * можно было бы заменить на [\w()]
для краткости с потерей эффективности \x{2022}
(Личные предпочтения) [-\dn]
. (Эффективность / Точность) Когда вам приходится описывать длинную строку со многими частями, первый рефлекс должен использовать режим свободного пространства (модификатор x) и именованные группы (даже если именованные группы не очень полезны в контексте замены, они помогают сделать шаблон читается и более легко отлаживается):
~^ (?<No> [0-9]+ ) \h+ (?<word> \pL+ ) \h+ (?<type> [\pL()]+ (?: , \h* [\pL()]+ )* ) \h+ (?<wd_tr> [^•]* [^•\s] ) \h* \R • \h* (?<sent_fr> [^–]* [^\s–] ) \s* – \s* (?<sent_eng> .* (?:\R .*)*? ) \h* \R (?<num1> [0-9]+ ) \h* \| \h* (?<num2> .*\S ) ~xum
демонстрация
Не существует волшебного рецепта для построения шаблона для строки с размытым форматом. Все, что вы можете сделать, это быть наиболее суровым в начале и добавлять гибкость, когда вы сталкиваетесь с случаями, которые не совпадают.