0

У меня возникли проблемы с написанием регулярного выражения в Java для анализа информации из файла журнала.Регулярные выражения Java с отрицательным взглядом

У меня есть строка, в которой структура «timeinstant: некоторые строки с любым символом» повторяется от 1 до N раз.

timeinstant имеет формат «dd/mm/yyyy hh: MM: ss: MMMMMM» (М - микросекунды).

Что я пытаюсь сделать, так это найти микросекунды последнего времени, содержащиеся в входящей строке.

Например, со строкой

] 2012/04/02 16:28:51:861819: abcdefg : lwersdgsdg remote=xx.xxx.xx.xxx:yyy3f] accepted and identified as: John 2012/04/02 16:28:51:862987: pump: Received data on connection {John} [ 

я хотел m.find(), чтобы указать на "987: pump...". Для того, чтобы получить это, им с помощью регулярных выражений с опережающего просмотра:

"(\\d{3}:)(?!\\d{4}/\\d{2}/\\d{2}\\s\\d{2}:\\d{2}:\\d{2}:\\d{6})"

Но сейчас m.find() указывает на 819 (содержится в 2012/04/02 16:28:51:861819).

ответ

2

Ваше регулярное выражение очень близко к тому, которое вам нужно.

В своем негативном свете вы просто забыли, что разные временные метки разделены несколькими символами. Поэтому вы должны добавить .+ или .* в свой lookahead, чтобы указать это.

Вот регулярное выражение вам нужно:

"(\\d{3}):(?!.+\\d{4}/\\d{2}/\\d{2}\\s\\d{2}:\\d{2}:\\d{2}:\\d{6})" 

В вашем примере, это даст вам «987» вы ищете.

+0

Вот и все. Я добавил. * В начале и в конце взгляда. Большое спасибо. – Tom

0

Почему вы не просто использовать

(\\d{3}: \\w+)

, а затем использовать find.next() до тех пор, пока не какой-либо дальше?

+0

Я не могу изменить код java, только регулярное выражение, которое оно получает. – Tom

1

Если вас интересует только последнее вхождение трех цифр, за которым следует двоеточие, не будет .*(\d{3}:)?

+0

Нет, по какой-то причине я получаю первое появление thredigits, за которым следует «:» – Tom

+0

''. * (\\ d {3}): «' должен записывать '987' не' 819'. – anubhava