Регулярное выражение соответствует только второй группе

Есть ли способ просто сопоставить строку второй группы, просто используя регулярное выражение?

Я использую инструмент глобальные фильтры журнала Rundeck (Hightlight Output)< /а>

Описание инструмента:

Регулярное выражение для проверки. Используйте группы для выборочного выделения. Еще Используйте шаблон без группировки, чтобы выделить все совпадения:

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

регулярное выражение: это (является) результатом (теста): это является тестом См. Java Pattern.

Пример:

3)  Manager port: 2614
4)  Tcp Port: 2615
3)  Manager port: 2714
4)  Tcp Port: 2715

Выше приведены строки, я хочу получить совпадение только "3) Manager port: 2714". Вот что я придумал (?:Manager port:.*){1}

Но он по-прежнему соответствует как 3) Manager port: 2614, так и 3) Manager port: 2714.

Спасибо


person Jervis Lin    schedule 23.10.2017    source источник
comment
Конечно, [\s\S]*\KManager port:.*   -  person Wiktor Stribiżew    schedule 23.10.2017
comment
@WiktorStribiżew Большое спасибо. Это именно то, что мне нужно.   -  person Jervis Lin    schedule 23.10.2017
comment
Если вам нужна только вторая строка, начинающаяся с 3) Порт менеджера: вам не следует использовать регулярное выражение. простой String.startsWith() сделает свое дело.   -  person Nir Alfasi    schedule 23.10.2017
comment
@JervisLin Вы уверены, что это работает в вашей целевой среде? Пожалуйста, проверьте и дайте знать. Это только шаблон регулярного выражения PCRE/Onigmo/Boost/PyPi.   -  person Wiktor Stribiżew    schedule 23.10.2017
comment
@WiktorStribiżew Спасибо, что подняли этот вопрос. Я только что протестировал его, и он не работал в моей среде. Мой использует шаблон Java   -  person Jervis Lin    schedule 23.10.2017
comment
@JervisLin Пожалуйста, опубликуйте код или название инструмента, в котором вы используете шаблон.   -  person Wiktor Stribiżew    schedule 23.10.2017
comment
@alfasin Я использую фильтр журнала функций rundeck, для работы которого требуется регулярное выражение.   -  person Jervis Lin    schedule 23.10.2017
comment
@WiktorStribiżew Я обновил свой вопрос, чтобы включить инструмент, который я использую   -  person Jervis Lin    schedule 23.10.2017
comment
Итак, вам нужно [\s\S]*(Manager port:.*) или (?s:.*)(Manager port:.*)   -  person Wiktor Stribiżew    schedule 23.10.2017


Ответы (1)


(?:Manager port:.*){1} равно Manager port:.* и просто соответствует любой подстроке Manager: и остальной части строки.

С библиотекой регулярных выражений java.util.regex вы можете использовать

[\s\S]*(Manager port:.*)

См. демонстрацию регулярного выражения.

Подробнее

  • [\s\S]* - любые символы 0+ как можно больше (обратите внимание, что [\s\S] - это "хак", вы можете безопасно использовать (?s:.*), чтобы делать то же самое, поскольку (?s:.*) представляет группу модификаторов с включенным модификатором DOTALL и, таким образом, . соответствует любому символу, включая строку сломать символы)
  • ( - Начало группы захвата
  • Manager port: - литеральная подстрока
  • .* - 0+ символов, кроме символов разрыва строки, как можно больше.
  • ) - конец группы захвата.
person Wiktor Stribiżew    schedule 23.10.2017
comment
По некоторым причинам он до сих пор подсвечивает обе записи в Rudeck. Не совсем уверен в первопричине этого - person Jervis Lin; 23.10.2017
comment
просто киньте ссылку на вопрос - person Jervis Lin; 23.10.2017
comment
@JervisLin Без понятия, правда. Должно быть, это ошибка, потому что в документации сказано, что это должно работать. Вы используете последнюю сборку? 10 дней назад было обновление. - person Wiktor Stribiżew; 24.10.2017
comment
получить ответ от службы поддержки Rundeck, в котором упоминается, что фильтр глобального лога Highlight Output применяется «построчно», то есть он не может фильтровать многострочные шаблоны. Я приму это как ответ, поскольку он работает так, как описано в вопросе. - person Jervis Lin; 25.10.2017