#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]
.