Если я хочу получить имя между «для» и «;» который является NISHER HOSE, не могли бы вы помочь мне найти правильное регулярное выражение, так как существует более одного «for» и «;» в строке
Для запроса доступа требуется разрешение владельца данных №: 2137352 для NISHER HOSE; ПОДРЯДЧИК; Менеджер: МЮИЛЛЕР, ТИМ (TWM0069)
Используя регулярное выражение (?<=for).*(?=;)
я получаю неправильное совпадение Access Request #: 2137352 for NISHER HOSE; CONTRACTOR
- см. скриншот на https://www.regextester.com/
Спасибо
Основная проблема здесь в том, что есть два «за». Если вы хотите поймать имя, используйте «:» в качестве разделителя, чтобы поймать второе «для»:
/:.*for(.+?);/gm
Имя будет захвачено в группе 1. Если вы решите использовать просмотр вперед/обратный просмотр, просто имейте в виду, что они могут поддерживаться или не поддерживаться в зависимости от механизма регулярных выражений.
Спасибо. Отсюда мне придется использовать манипуляции со строками, чтобы получить только имя? Иначе как бы я смог получить отсюда имя.
Соответствие регулярному выражению возвращает совпадение и любые захваченные группы. В этом случае вы можете найти имя внутри группы 1. Доступ к нему зависит от языка, но в целом это просто вопрос match[1]
.
Если вы хотите утверждать только for
слева, вы должны убедиться, что for
больше не совпадает, и вы должны исключить совпадение ;
, утверждая, что он есть справа.
(?<=\bfor )(?:(?!\bfor\b)[^;])+(?=;)
Объяснение
(?<=\bfor )
Утвердить for
слева(?:(?!\bfor\b)[^;])!
Совпадение 1+ раз с любым символом, кроме ;
, если из текущей позиции, за которой непосредственно не следует for
, окружено границами слов(?=;)
Утвердить ;
прямо справаДемонстрация регулярных выражений
Отлично решил мою проблему! Спасибо
Использовать
(?<=\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))
Попробуйте (?<=.*for)(\w|\s)*(?=;) При условии, что имя состоит только из буквенно-цифровых символов с пробелами, оно должно работать... ваш * собирал все...