Если вы отмените избежать символов, вы получите следующее:
.* ([\d]{3}:[\d]{3}:[\d]{3}.[\d]{5}).[^\n]
Термин [\d]{x}
будет соответствовать x
число последовательных цифр. Поэтому часть внутри круглых скобок будет соответствовать чему-то вроде формы ###:###:###?#####
(где #
может быть любой цифрой и ?
может быть любым символом). Скобки не совпадают, они просто используются для указания того, какая часть ввода «захвата» и возврата к вызывающему. После этой последовательности находится одна точка .
, которая соответствует одному символу (который может быть любым). Конечный [^\n]
будет соответствовать одному символу, который является чем-то , за исключением a newline (a ^
в начале выражения в квадратных скобках инвертирует совпадение). Термин .*
в самом начале соответствует последовательности символов любой длины (даже нулевой), за которой следует пробел.
С учетом всего этого, похоже, это регулярное выражение извлекает серию цифр из середины строки. Учитывая формат чисел, он может искать временную метку в формате hours:minutes:seconds.milliseconds
(хотя, если это так, вместо этого следует использовать {1,3}
и {1,5}
). Заключительный термин .[^\n]
выглядит так, будто он может пытаться исключить отметки времени, которые находятся на конце линии или рядом с ней. Временные журналы часто имеют временную метку, за которой следует какой-то разделительный символ (:
, >
, пробел и т. Д.). Такое регулярное выражение может быть использовано для извлечения временных меток из журнала при игнорировании «пустых» строк с меткой времени, но без сообщения.
Обновление: Ниже приведен пример с использованием TCL 8.4:
% set re ".* (\[\\d]\{3\}:\[\\d]\{3\}:\[\\d]\{3\}.\[\\d]\{5\}).\[^\\n]"
% regexp $re "TEST: 123:456:789:12345> sample log line"
1
% regexp $re " 111:222:333.44444 foo"
1
% regexp $re "111:222:333.44444 foo"
0
% regexp $re " 111:222:333.44444 "
0
% regexp $re " 10:44:56.12344: "
0
%
% regexp $re "TEST: 123:456:789:12345> sample log line" match data
1
% puts $match
TEST: 123:456:789:12345>
% puts $data
123:456:789:12345
Первые два примера соответствуют выражению. Третий не работает, потому что ему не хватает символа пробела перед первой последовательностью чисел. Четвертый терпит неудачу, потому что после конечного пробела он не имеет символа без символа новой строки. Пятый не работает, потому что числовые последовательности не имеют достаточного количества цифр. Пропуская параметры после ввода, вы можете сохранить часть входа, которая соответствовала выражению, а также данные, которые были «захвачены» с помощью круглых скобок. См. the TCL wiki для получения дополнительной информации о команде regexp
.
Интересная часть с TCL является то, что вы должны избежать [
характер, но не ]
, в то время как {
и }
необходимость побега.
На каком языке вы пишете это регулярное выражение? –
кажется, что все языки программирования используют те же правила для регулярных выражений? –
@ratzip не соответствует действительности; Посмотрите различия между POSIX BRE/ERE и PCRE, среди других вкусов. http://en.wikipedia.org/wiki/Regular_expression – cmbuckley