Here's what I came up with:
\v sets the expression to very magic (
^ anchors the expression to the beginning of a line
(\S+) is the first word of the line, we will later compare to this
.*\n the rest of the line including line break; we don't really care about this
\1@! matches an empty string here if
\1 would not match (
\1 is the first word of the previous line)
& match this if what comes before (anything other than
\zs ignore what we matched before, this is where the real match starts,
.* match the rest of the line, meaning the entire line, because we only matched "" with
& goes back to the starting position anyway*.
So, what this ends up doing is match a whole line if it starts with a different word than the preceding line. If you want to filter a bit more, and, say, only want lines with a time
\d+:\d+ at the start, just switch out the
\S+ for your (more specific) pattern.
Finally, as for highlighting those lines, you can use
:help :match and
:help group-name) like so:
:match Todo /\v^(\S+).*\n(\1@!&\zs.*)/. I am using
Todo here because I like doing that for generic highlights, but you could also use
Underlined for something less in-your-face, or
Error for something even more important-looking. The end result would ultimately be the same though.
*meaning, for example,
/..:..&00/ matches 00:00 because both
..:.. match 00:00, but it doesn't match 11:1100, because while
..:.. matches 11:11,
00 goes back again and tries matching at the same place
..:.. did, not after it.