Я пытаюсь сопоставить пять подстрок в каждом блоке текста (всего 100 блоков).
Я сопоставляю 99% блоков текста, но с несколькими ошибками, касающимися групп 3 и 4.
Вот демонстрационная ссылка: https://regex101.com/r/cW2Is3/4
Группа 3 — это «части речи», а группа 4 — это английский перевод.
В первом блоке текста det, pro
все должны быть в группе 3, а затем the; him, her, it, them
должен быть в группе 4.
Та же проблема возникает снова в третьем блоке текста.
Группа 3 должна быть adj, det, nm, pro
и группа 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
Я сделал все возможное, чтобы оптимизировать шаблон. Я сбрил почти 10000 шагов от твоего паттерна и достиг 100 матчей по желанию.
^
используется для определения начала каждого блока (эффективность / точность) \d
используется вместо [0-9]
(Краткость)\s
заменяется буквальным пробелом, где это применимо (краткость)\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
Нет волшебного рецепта для построения шаблона для строки с размытым форматом. Все, что вы можете сделать, — это быть максимально сужающим в начале и добавить гибкость, когда вы сталкиваетесь с несоответствующими случаями.