Intereting Posts
mysqli_stmt :: bind_result (): Число переменных привязки не соответствует количеству полей в подготовленном сообщении Предупреждение о побочном эффекте сеанса PHP с глобальными переменными как источник данных sql UPDATE row :: оставить текущее значение, если вход пустой Laravel 5.1: htmlentities () ожидает, что параметр 1 будет строкой, заданный массив Кодирование графического индикатора выполнения в php (проблема с перекрытием) PHP domDocument для удаления дочерних узлов дочернего узла ASIHTTPRequest сообщение json на php-сервер Конвертировать дату в gmt – php Загрузка файла в Yii с помощью ajax Реализация входа в систему вместе с suPHP Учетная запись Paypal Express Checkout отсутствует. Ошибка 10400 Как получить значения POST из serializeArray в PHP? PHP: массив для самостоятельной привязки как можно рассчитать общую стоимость за 5 дней (mysql) систему бронирования отелей Развертывание приложения Symfony2 с ошибками fosuserbundle

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

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

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

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