ReGex, как найти второй экземпляр строки

Если я хочу получить имя между «для» и «;» который является NISHER HOSE, не могли бы вы помочь мне найти правильное регулярное выражение, так как существует более одного «for» и «;» в строке

Для запроса доступа требуется разрешение владельца данных №: 2137352 для NISHER HOSE; ПОДРЯДЧИК; Менеджер: МЮИЛЛЕР, ТИМ (TWM0069)

Используя регулярное выражение (?<=for).*(?=;) я получаю неправильное совпадение Access Request #: 2137352 for NISHER HOSE; CONTRACTOR - см. скриншот на https://www.regextester.com/

Спасибо

Попробуйте (?<=.*for)(\w|\s)*(?=;) При условии, что имя состоит только из буквенно-цифровых символов с пробелами, оно должно работать... ваш * собирал все...

GoodJuJu 11.12.2020 10:22
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
413
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Основная проблема здесь в том, что есть два «за». Если вы хотите поймать имя, используйте «:» в качестве разделителя, чтобы поймать второе «для»:

Имя будет захвачено в группе 1. Если вы решите использовать просмотр вперед/обратный просмотр, просто имейте в виду, что они могут поддерживаться или не поддерживаться в зависимости от механизма регулярных выражений.

Спасибо. Отсюда мне придется использовать манипуляции со строками, чтобы получить только имя? Иначе как бы я смог получить отсюда имя.

alvini 10.12.2020 19:54

Соответствие регулярному выражению возвращает совпадение и любые захваченные группы. В этом случае вы можете найти имя внутри группы 1. Доступ к нему зависит от языка, но в целом это просто вопрос match[1].

adelriosantiago 10.12.2020 19:57
Ответ принят как подходящий

Если вы хотите утверждать только for слева, вы должны убедиться, что for больше не совпадает, и вы должны исключить совпадение ;, утверждая, что он есть справа.

(?<=\bfor )(?:(?!\bfor\b)[^;])+(?=;)

Объяснение

  • (?<=\bfor ) Утвердить for слева
  • (?:(?!\bfor\b)[^;])! Совпадение 1+ раз с любым символом, кроме ;, если из текущей позиции, за которой непосредственно не следует for, окружено границами слов
  • (?=;) Утвердить ; прямо справа

Демонстрация регулярных выражений

Отлично решил мою проблему! Спасибо

alvini 10.12.2020 19:54

Использовать

(?<=\bfor )(?![^;]*\bfor\b)[^;]+

Смотрите доказательство.

Объяснение

--------------------------------------------------------------------------------
  (?<=                     look behind to see if there is:
--------------------------------------------------------------------------------
    \b                       the boundary between a word char (\w)
                             and something that is not a word char
--------------------------------------------------------------------------------
    for                      'for '
--------------------------------------------------------------------------------
  )                        end of look-behind
--------------------------------------------------------------------------------
  (?!                      look ahead to see if there is not:
--------------------------------------------------------------------------------
    [^;]*                    any character except: ';' (0 or more
                             times (matching the most amount
                             possible))
--------------------------------------------------------------------------------
    \b                       the boundary between a word char (\w)
                             and something that is not a word char
--------------------------------------------------------------------------------
    for                      'for'
--------------------------------------------------------------------------------
    \b                       the boundary between a word char (\w)
                             and something that is not a word char
--------------------------------------------------------------------------------
  )                        end of look-ahead
--------------------------------------------------------------------------------
  [^;]+                    any character except: ';' (1 or more times
                           (matching the most amount possible))

Другие вопросы по теме

Похожие вопросы

Regex для разделения строки процентов использования ЦП?
Классификация имен таблиц, начинающаяся с и заканчивающаяся на в Oracle DB
Итеративно захватывайте подгруппы регулярных выражений в Scala
Отрицательный взгляд назад не работает должным образом. Как предотвратить захват строки второй группой?
Поиск текста с помощью регулярного выражения NEAR
Регулярное выражение для поиска текста после последнего появления символа до другого
Python Regex: добавьте ограничение, что это НЕ должно быть совпадением, если где-то перед совпадением есть кавычка И где-то после
Как я могу определить правило перезаписи, чтобы принимать также пустую строку в дополнение к a-zA-Z-?
Извлечение всех строк на основе двух столбцов с использованием Regex в postgresql
Почему производительность двух регулярных выражений, использующих группы захвата, сильно различается?