Groovy возвращает массив для каждого совпадения

#java #regex #groovy

#java #регулярное выражение #groovy

Вопрос:

В моих журналах есть строки по следующему шаблону output:server-01-logs_20190401162454 , output:database-01-logs_20190401162454 . Мне нужно сопоставить строку перед символом подчеркивания ( _ ), т.е. Вывод: database-01-logs и вывод: server-01-logs. Итак, я использую следующий шаблон:

 result = text =~ /output:([^_] )/
Iterator<String> elements = result.iterator();
while (elements.hasNext()) {
  System.out.println(elements.next());
}
 

Но результат, который я получаю, — это массив совпадений для каждой строки, как показано ниже

 [output:server-01-logs, server-01-logs]
[output:database-01-logs, database-01-logs]
 

Чего я ожидаю, так это

 output:server-01-logs
output:database-01-logs
 

Может кто-нибудь помочь мне с тем, чего мне здесь не хватает?

Комментарии:

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

Ответ №1:

Вы можете удалить группу захвата (поскольку, похоже, вы не хотите получать какие-либо подматчи) и использовать

 def text = "output:server-01-logs_20190401162454, output:database-01-logs_20190401162454"
def result = (text =~ /output:[^_] /).collect()
 

Посмотрите эту демонстрацию Groovy.

Или, если вы хотите сохранить группу захвата, соберите значения группы 0:

 def text = "output:server-01-logs_20190401162454, output:database-01-logs_20190401162454"
def result = (text =~ /output:([^_] )/).collect { it[0] }
print(result)
 

Вывод:

 [output:server-01-logs, output:database-01-logs]
 

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

Если вам нужны захваченные значения, замените it[0] на it[1] .