Jenkins/Groovy: как вытащить определенную часть строки

У меня есть строка, которая выглядит так:

data = ABSIFHIEHFINE -2938 NODFNJN {[somedate]} oiejfoen

Мне нужно тянуть {[somedate]} только с включенным {[]}. Я пытался сделать data.substring(0, data.indexOf(']}')), чтобы удалить конец строки, но он также удаляет символы, которые мне нужно сохранить.

"DevOps: Jenkins & AWS Series, часть 5: Установка Gradle на Ubuntu 22.04
"DevOps: Jenkins & AWS Series, часть 5: Установка Gradle на Ubuntu 22.04
В этой статье блога мы проведем вас через процесс установки Gradle на Ubuntu 22.04, интеграции его с Jenkins и создания задания Gradle. Мы...
0
0
36
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

I need to pull {[somedate]} only with {[]} included.

def data = 'ABSIFHIEHFINE -2938 NODFNJN {[somedate]} oiejfoen'

// you could do error checking on these to ensure
// >= 0 and end > start and handle that however 
// is appropriate for your requirements...
def start = data.indexOf '{['
def end = data.indexOf ']}'

def result = data[start..(end+1)]

assert result ==  '{[somedate]}'

Вы можете сделать это с помощью поиска по регулярным выражениям:

data = "ABSIFHIEHFINE -2938 NODFNJN {[somedate]} oiejfoen"
def matcher = data =~ /\{\[.+?\]\}/
if ( matcher ) {
    echo matcher[0]
}
else {
    echo "no match"
}

Выход:

{[somedate]}

Пояснения:

  • =~ — оператор поиска. Это создает java.util.regex.Matcher.
  • Строка между косой чертой (это еще один способ определить строковый литерал) является регулярным выражением: \{\[.+?\]\}
  • Разбивка регулярное выражение:
    • \{\[ - литералы { и [, которые необходимо экранировать, потому что они имеют особое значение в RegEx.
    • .+? - любой символ, хотя бы один, как можно меньше (для поддержки поиска нескольких подстрок, заключенных в {[]})
    • \]\} - литералы ] и }, которые необходимо экранировать, потому что они имеют особое значение в RegEx.
  • Вы можете использовать проверить только регулярное выражение или использовать Groovy IDE для тестирования полного образца кода (замените echo на println).

Другие вопросы по теме