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

Вопрос или проблема

у меня есть эта строка grafana-stack_alloy и мне нужно все после первого подчеркивания alloy.

Мне нужен результат как группа $1. Я пробовал это, но это не сработало. (?:)?([^_]+)*$.

Может кто-то помочь мне решить эту проблему?

Я тестирую это:

        правило {
        действие        = "заменить"
        источниковые_ярлыки = [
            "__meta_docker_container_label_com_docker_swarm_service_name",
        ]
        регулярное_выражение        = "^(?:;*)?([^;]+).*$" работает, но неверно
        //регулярное_выражение      = "[^_]+.$" ----> не работает
        //регулярное_выражение      = "([^_]+)$" ----> не работает
        замена  = argument.namespace.value + "/$1"
        целевой_ярлык = "job"
    }

Это касается агента Grafana с relabel-regex:
Grafana prometheus.relabel, который использует Google’s RE2 в качестве своего движка регулярных выражений.

Спасибо заранее

Эти выражения получат все после последнего подчеркивания.

_([^_]+)$

или

^.*_([^_]+)$

Если вы хотите все после первого подчеркивания:

^[^_]*_(.+)$

или измените первый * на +, если не хотите ведущих подчеркиваний.

Если вы также хотите устранить второе подчеркивание в двойном подчеркивании, но получить все после этого, попробуйте

^[^_]*_+(.+)$

Если вы хотите более специфичное соответствие, возможно, вам нужно

grafana-stack_([^_]+)$

Если ни одно из этих выражений не соответствует тому, что вам нужно, вам нужно будет дать больше окружающего контекста, чем строку, которую вы предоставили.

Что касается использования Grafana языка регулярных выражений Golang, вам нужно изменить регулярное выражение на:

([^_])*$

Смотрите онлайн-демо объяснений

Официальная документация также упоминает Golang:

expression должно быть строкой Go RE2 regex.

Ответ или решение

Для решения задачи по удалению всего текста до первого символа подчеркивания (_) в строке, вам необходимо использовать регулярные выражения (regex). В представленном вами случае строка выглядит как grafana-stack_alloy, и вам необходимо извлечь всё, что находится после первого подчеркивания, то есть alloy.

Подходящее регулярное выражение

Для этой задачи вы можете использовать следующее регулярное выражение:

^[^_]*_(.+)$

Разбор регулярного выражения:

  1. ^: Обозначает начало строки.
  2. *`[^_]`**: Этот шаблон захватывает любые символы, кроме символа подчеркивания, ноль или более раз до тех пор, пока не встретит первое подчеркивание.
  3. _: Соответствует символу подчеркивания. Он непосредственно указывает, где будет разделен текст.
  4. (.+)$: Эта часть захватывает один или более любых символов (которые идут после подчеркивания) до конца строки. В этом месте мы получаем то, что нам нужно: всё после первого подчеркивания.

Использование в Grafana

Если вы работаете с Grafana и используете этот шаблон в блоке правил relabel, вы можете использовать его следующим образом:

rule {
    action        = "replace"
    source_labels = [
        "__meta_docker_container_label_com_docker_swarm_service_name",
    ]
    regex         = "^[^_]*_(.+)$"
    replacement   = argument.namespace.value + "/$1"
    target_label  = "job"
}

Дополнительные варианты

Если по каким-то причинам вы хотите исключить ведущие подчеркивания или использовать регулярные выражения, которые могут захватывать случайные строки с несколькими подчеркиваниями, рассмотрите следующие варианты:

  • Для удаления всех подчеркиваний, которые могут быть в начале строки, можно использовать:

    ^_*(.+)$
  • Если вам нужно обрабатывать случаи с несколькими подчеркиваниями, но вы хотите извлечь всё после первого, ваше регулярное выражение остаётся прежним ^[^_]*_(.+)$.

Заключение

Регулярные выражения – это мощный инструмент для обработки строк, и с правильным подходом вы можете легко извлекать нужные части строки, как в данном случае. Надеюсь, данная информация будет полезна и поможет вам успешно реализовать вашу задачу в Grafana с использованием правил relabel, основанных на регулярных выражениях.

Оцените материал
Добавить комментарий

Капча загружается...