Регулярное выражение для получения значения из ‹key, value› путем утверждения условий для значения

У меня есть регулярное выражение, которое принимает значение из данного ключа, как показано ниже.

Регулярное выражение .*key="([^"]*)".* InputValue key="abcd-qwer-qaa-xyz-vwxc"

выход abcd-qwer-qaa-xyz-vwxc

Но, помимо этого, мне нужно проверить значение, начиная только с abcd-, и где-то следующий шаблон соответствует -xyz

Таким образом, вход и выход должны быть следующими:

вывод для сопоставления

Я пробовал ниже, что не работает должным образом

.*key="([^"]*)"?(/Babcd|-xyz).*

Пара ключ-значение является частью большой строки, как показано ниже:

object{one="ab-vwxc",two="value1",key="abcd-eest-wd-xyz-bnn",four="obsolete Values"}

Я думаю, что при сопоставлении ключа он принимает значение, и я использовал это .*key="([^"]*)".*

Примечание. Это панель инструментов. вы можете перейти по этой ссылке и выполнить поиск Regex: /"([^"]+)"/ Это регулярное выражение применяется к результату запроса, который представляет собой строку, на которую я ссылался. Он работает с этим регулярным выражением .*key="([^"]*)".* выше. Я пытаюсь изменить саму эту regexGroup. Надеюсь это поможет?

Может ли кто-нибудь направить или предложить мне по этому поводу, пожалуйста? Это было бы полезно. Спасибо!


person CdVr    schedule 15.07.2020    source источник
comment
Не по теме, но вам следует вернуться к ранее заданным вопросам и посмотреть, сможете ли вы проголосовать/принять какой-либо из ответов. Его простая вежливость и то, как работает этот сайт .   -  person JvdV    schedule 15.07.2020
comment
В дополнение к комментарию @JvdV приведенная ссылка содержит слова «Принятие» не означает, что это лучший ответ, это просто означает, что он сработал для человека, который спросил. Это может быть политикой, но я думаю, что на практике спрашивающие склонны выберите ответ, который они считают наиболее полезным (при условии, что хотя бы один из них оказался полезным). Хотя выбор ответа приветствуется, вы можете подождать некоторое время, прежде чем сделать это, главным образом потому, что быстрый выбор может отбить у некоторых читателей охоту публиковать дополнительные ответы.   -  person Cary Swoveland    schedule 15.07.2020


Ответы (3)


Похоже, вы могли бы сделать с:

\bkey="(abcd(?=.*-xyz\b)(?:-[a-z]+){4})"

См. демоверсию онлайн.

  • \bkey=" - граница слова и буквальное соответствие 'key='
  • ( - Open 1st capture group.
    • abcd - Literally match 'abcd'.
    • (?=.*-xyz\b) - Положительный просмотр вперед для нуля или более символов (кроме новой строки), за которым следует буквально "-xyz" и граница слова.
    • (?: - Open non-capturing group.
      • -[a-z]+ - Match an hyphen followed by at least a single lowercase letter.
      • ){4} - Закрыть группу без захвата и сопоставить ее 4 раза.
    • ) - Закрыть 1-ю группу захвата.
  • " — соответствует буквальной двойной кавычке.

Я не уверен на 100%, что вы хотите разрешить только строчные буквы, чтобы вы могли настроить эту часть, если это необходимо. Весь шаблон проверяет входное значение, тогда как вы можете использовать первую группу захвата, чтобы получить ключ.


введите здесь описание изображения


Обновить после редактирования вопроса с новой информацией:

Prometheus использует движок RE2 во всех регулярных выражениях. Поэтому приведенное выше предложение не будет работать из-за обхода. Менее строгий, но возможный ответ для ОП может быть:

\bkey="(abcd(?:-\w+)*-xyz(?:-\w+)*)"

См. демонстрацию в Интернете.

person JvdV    schedule 15.07.2020
comment
Обновили вопрос, объяснив полный ввод, к которому должно применяться регулярное выражение. извините за пропажу. не могли бы вы обновить ответ? Для одного ключа оцените его работу. Но значение ключа является частью большой строки в вопросе, который я редактировал. Спасибо. - person CdVr; 15.07.2020
comment
@JvdV, как ты создал это изображение? - person Bren; 15.07.2020
comment
@Брен. Я получил его от здесь - person JvdV; 15.07.2020
comment
@JvdV в редакторе все в порядке. Но моя реальная реализация лежит в другом приложении, которое ничего не возвращает. но он возвращает значение группы 1, которое находится на правой панели ссылки. Можно ли как-то обновить существующую в ссылке с использованием концепции группы? - person CdVr; 15.07.2020
comment
О каком приложении вы говорите. Похоже, вы можете обновить свой ОП более актуальной информацией. Если вы не можете работать с группами, попробуйте: (?<=\bkey=")abcd(?=.*-xyz\b)(?:-[a-z]+){4}(?="). По сути, это та же проверка, но с положительным обзором. - person JvdV; 15.07.2020
comment
Это приборная панель. вы можете перейти по этой ссылке и выполнить поиск Regex: /"([^"]+)"/ в ссылке Это регулярное выражение применяется к результату запроса, который представляет собой строку, на которую я ссылался. Он работает с этим регулярным выражением. Я пытаюсь изменить саму эту regexGroup. Поможет ли это? @JvdV - person CdVr; 15.07.2020
comment
Вы должны обновить свой исходный вопрос этой информацией, чтобы другие тоже могли ее прочитать. Я также понятия не имею, что вы сейчас пытаетесь. Вы упомянули, что это работает сейчас? - person JvdV; 15.07.2020
comment
Давайте продолжим обсуждение в чате. - person CdVr; 15.07.2020

Будет ли это работать?

Шаблон

\bkey="(abcd-[^"]*\bxyz\b[^"]*)"

Демо

person Bren    schedule 15.07.2020
comment
Обновили вопрос, объяснив полный ввод, к которому должно применяться регулярное выражение. извините за пропажу. не могли бы вы обновить ответ? Для одного ключа оцените его работу. Но значение ключа является частью большой строки в вопросе, который я редактировал. Спасибо. - person CdVr; 15.07.2020
comment
@venkat попробуй сейчас - person Bren; 15.07.2020

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

(?<=\bkey=")(?=.*-xyz(?=-|$))abcd(?:-[a-z]+)+(?=")

Запустите свой движок!

Обратите внимание, что группы захвата отсутствуют.

Механизм регулярных выражений выполняет следующие операции.

(?<=\bkey=")  : positive lookbehind asserts the current
                position in the string is preceded by 'key=' 
(?=           : begin positive lookahead
  .*-xyz      : match 0+ characters, then '-xyz'
  (?=-|$)     : positive lookahead asserts the current position is
              : followed by '-' or is at the end of the string
)             : end non-capture group
abcd          : match 'abcd'
(?:           : begin non-capture group
  -[a-z]+     : match '-' followed by 1+ characters in the class
)+            : end non-capture group and execute it 1+ times
(?=")         : positive lookahead asserts the current position is
              : followed by '"'
person Cary Swoveland    schedule 15.07.2020
comment
Я только что узнал, что Prometheus использовал RE2 двигатель =( - person JvdV; 15.07.2020
comment
@JvdV, я так не думаю. Помимо того, что Прометей даже не был реальным человеком, движок RE2 был выпущен намного позже времени его подвигов. - person Cary Swoveland; 15.07.2020
comment
Я вижу, что ты там сделал =). Примечание для себя: следите за моим английским рядом с Кэри. - person JvdV; 15.07.2020
comment
Я не нахожу способ отрицать шаблон. Есть ли обходной путь для этого? Это похоже на следующий вопрос SOF ссылка - person CdVr; 22.07.2020