Как дополнительно добавить запятую и пробел в группу захвата?

Я пытаюсь сопоставить пять подстрок в каждом блоке текста (всего 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*

1

Решение

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], (Эффективность / Точность)
1

Другие решения

Когда вам нужно описать длинную строку со многими частями, первым рефлексом является использование режима свободного пространства (модификатор 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

демонстрация

Нет волшебного рецепта для построения шаблона для строки с размытым форматом. Все, что вы можете сделать, — это быть максимально сужающим в начале и добавить гибкость, когда вы сталкиваетесь с несоответствующими случаями.

1