Получите первое совпадение перед положительным прогнозом с модификатором флага в одну строку - PullRequest
0 голосов
/ 23 апреля 2020

Мое регулярное выражение

(\d*,\d*) \d*/\d*(?=.*?Open Recall Check)

совпадает по всем интересующим вопросам, кроме совпадений по слишком большому количеству ... Я хотел бы вернуть только первое совпадение по пробегу непосредственно перед "Открытым отзывом" Проверьте". Вместо этого он соответствует всем милям.

В моем примере на regex101.com я получил 29 совпадений, но из них я только пытаюсь вернуть эти 10:

  • 75,115 (соответствует совпадению 1)
  • 92,748 (соответствует совпадению 7)
  • 62,300 (соответствует совпадению 8)
  • 55,113 (соответствует совпадению 9)
  • 109,308 (соответствует совпадению 11)
  • 138,131 (соответствует совпадению 17)
  • 125,197 (соответствует совпадению 24)
  • 55,335 (соответствует совпадению 25)
  • 69,100 (соответствует совпадению 28)
  • 6,010 (соответствует совпадению 29)

Единственный способ, которым я мог это сделать, - вернуть все совпадения в списке, а затем просто отфильтруйте все, что появляется перед фразой «Открыть проверку отзыва», но я не смог выяснить, как включить эту фразу в список 10 раз (каждый вариант регулярного выражения, который я пробовал, также включает это 29 раз ... так что не очень полезно).

Что я могу настроить получить желаемый результат?

1 Ответ

1 голос
/ 23 апреля 2020

Чтобы не соответствовать всем другим показаниям одометра до Open Recall Check, в вашем прогнозе совпадать с Open Recall Check, для каждого персонажа вы должны утверждать, что в этот момент вы не соответствуете другим показаниям одометра. Вы можете сделать это с отрицательным прогнозом в пределах позитивного прогнозирования:

(?=(?:.(?!(?:\d+,)?\d+ \d+/\d+))*?Open Recall Check)

Обратите внимание, что одно из ваших показаний одометра - просто 5, поэтому вам нужно сделать цифры и запятую, прежде чем они необязательны, чтобы учесть то есть

((?:\d+,)?\d+)

Кроме того, для лучшей производительности регулярных выражений лучше превратить \d* в \d+. В целом, это дает это регулярное выражение:

((?:\d+,)?\d+) \d+/\d+(?=(?:.(?!(?:\d+,)?\d+ \d+/\d+))*?Open Recall Check)

Демонстрация по regex101

Обратите внимание, что на основании данных, которые вы поместили в regex101, совпадение 5 должно фактически быть 5, не 109,308.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...