Regex необязательный альтернативный поиск - PullRequest
2 голосов
/ 03 февраля 2020

Я пытаюсь получить некоторую информацию в виде групп из некоторого текста с помощью регулярных выражений. Требуемый результат находится вне текста: Please check the Health of the JVM=acq855SW1-srv1 Please check the acq855SW1-srv2 profile.It seems like down для получения

  • 1-е совпадение: описание как ' Пожалуйста, проверьте работоспособность JVM = acq855SW1-srv1 ' и JVM ' acq855SW1-srv1 '
  • 2-е совпадение: Описание как " Пожалуйста, проверьте профиль acq855SW1-srv2. Похоже, вниз " и JVM' acq855SW1-srv2 '

На данный момент мое регулярное выражение (?<Description>.*?the (?:JVM=|)(?<JvmName>[^\s]+)(?: profile.*+|)), и я пытаюсь избежать того факта, что в качестве совпадения используется также слово "Пожалуйста, проверьте здоровье".

Regex

Как я могу сделать так, чтобы он не остановился на «здоровье»?

Ответы [ 3 ]

2 голосов
/ 03 февраля 2020

Я бы использовал:

(?<Description>(?:(?!JVM=).)*the (?:JVM=)?(?<JvmName>\S+)(?: profile.*+)?)

Демонстрация и объяснение

2 голосов
/ 03 февраля 2020

Простое исправление состоит в том, чтобы отличить Health от других, добавив ограничение, что это значение должно содержать -.

. Это можно сделать, изменив [^\s]+ на [^\s]+-[^\s]+.

Таким образом, регулярное выражение результата:

(?<Description>.*?the (?:JVM=)?(?<JvmName>[^\s]+-[^\s]+)(?: profile.*+|))

enter image description here

Если - является предположением, которое не может быть сделано, вы могли бы сделать то же самое с числами.

[^\s]+\d[^\s]+

1 голос
/ 04 февраля 2020

С PCRE и некоторыми другими механизмами, такими как Ruby,. NET, PyPi regex, вы можете использовать несколько групп с одинаковыми именами и использовать шаблон, например

(?<Description>.*?the\s+(?:JVM=(?<JvmName>\S+)|(?<JvmName>\S+)\s+profile.*))

. для работы в PCRE добавьте (?J) в начале шаблона, чтобы включить эту функцию.

См. демонстрационный пример regex .

Подробности

  • (?<Description> - начало группы Description:
    • .*? - любые 0+ символов, кроме символов разрыва строки, как можно меньше
    • the - the слово
    • \s+ - 1+ пробелов
    • (?:JVM=(?<JvmName>\S+)|(?<JvmName>\S+)\s+profile.*) - Соответствующая группа без захвата:
      • JVM=(?<JvmName>\S+):
      • JVM= - подстрока JVM=
      • (?<JvmName>\S+) - группа JvmName: 1+ непробельных символов
      • | - или
      • (?<JvmName>\S+) - группа JvmName: 1+ непробельных символов
      • \s+ - 1+ пробелов
      • profile - слово profile
      • .* - любые 0+ символов, кроме символов разрыва строки, как можно больше.
  • ) - конец * 1 067 * группа.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...