4

Я пытаюсь сопоставить строку, которая будет иметь следующий формат:

username=joe password='this! is a password with "quotes" and spaces#913 custom1 customd afd weirdhuh? custom1=myvalue

Чтобы объяснить более подробно, это список переменных, разделенных знаками равенства. Допустимые переменные, которые могут быть переданы: имя пользователя, пароль и customX (где X - любое количество цифр (ов)).

Я специально пытаюсь сопоставить поле пароля, поскольку переданная переменная может технически содержать любое количество кавычек, пробелов и т.д., Которые являются допустимыми символами. Я решил, что наилучшей "точкой останова" для определения окончания строки пароля является наличие строки «customX =», из которой следует, что начинается следующая переменная.

Таким образом, в приведенном выше примере фактический пароль будет:

'this! is a password with "quotes" and spaces#913 custom1 customd afd weird huh?

Я пришел к следующему регулярному выражению:

(?i)password(?-i)=.+?(?= (?i)custom(?-i)\d+=)

Похоже, это соответствует следующему:

password='this! is a password with "quotes" and spaces#913 custom1 customd afd weird huh?

По сути, это то, что я хочу (я могу легко разобрать «пароль =»), но проблема в том, что это регулярное выражение работает, только если существует конечное «custom1 = myvalue» в конце строки. Если это будет удалено, то совпадения не будет вообще.

Мне нужно иметь возможность сопоставить строку пароля независимо от того, есть ли это окончательное значение или нет.

Бонусные баллы, если вы можете удалить «пароль =», чтобы получить только действительный пароль.

1 ответ1

2

но проблема в том, что это регулярное выражение работает только в том случае, если существует окончательный вариант «custom1 = myvalue»

Вы можете добавить необязательный конец строки для соответствия вместо custom1=myvalue:
(?i)password(?-i)=.+?((?= (?i)custom(?-i)\d+=)|$)

Бонусные баллы, если вы можете удалить «пароль =», чтобы получить только действительный пароль.

Используйте lookbehind при совпадении password=:
(?<=(?i)password(?-i)=).+?((?= (?i)custom(?-i)\d+=)|$)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .