23:06

Моё сознанье несется ракетой в сторону солнца!!!
[ok]

Доброй ночи!
Мне нужна помощь с регулярными выражениями XML. Вопрос несложный, но я что-то запуталась...

Я пишу парсер для логов. В файле строки вот такого типа


И мне нужно слепить выражение, которое будет их на колонки разбивать



Вот так правильно будет???


И еще, посоветуйте, пожалуйста, инструмент или прогу, с помощью которого можно проверять такие коды - ну то есть скармливать что-нибудь ему и смотреть, что получается, а то я в блокноте пишу и методом граблей по лбу на продакшн-сервере все проверяю...

И последнее, если я хочу отфильтровать только те строки где есть ERROR, регулярное выражение для тега filterin будет .*ERROR.* ? Или нет?
Заранее извиняюсь, я не программист))) Для меня это очень сложно.

Спасибо!

@темы: Программирование

Комментарии
16.11.2011 в 23:11

> Вот так правильно будет???

Нет, не правильно. Квантификатор * - обычно жадный.
Если язык позволяет, можно использовать *? или искать "все, кроме разделителя".
16.11.2011 в 23:15

> И последнее, если я хочу отфильтровать только те строки где есть ERROR,
> регулярное выражение для тега filterin будет .*ERROR.* ? Или нет?

Всё же, уточните язык. На perl это будет просто if ($m=~/ERROR/)

И да, для конкретно такой задачи намного эффективней использовать поиск подстроки, быстрее будет искать.
16.11.2011 в 23:18

Моё сознанье несется ракетой в сторону солнца!!!
Если язык позволяет, можно использовать *? или искать "все, кроме разделителя".
эээ...а как? у меня не все строки в таком формате (exception'ы пишутся в несколько строк), поэтому я хочу выбрать только те, которые начинаются с таймстемпа тупо проигнорив все остальные, а для этого таймстемп нужно как-то выцепить. наверное. А что можно вместо * использовать?
16.11.2011 в 23:21

Моё сознанье несется ракетой в сторону солнца!!!
Trotil, Хорошо, уточню... на всякий случай, а это может быть javasсript?
16.11.2011 в 23:25

([0-9]{4}-[0-9]{2}-[0-9]{2}/[0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]{3}) (\[Thread-\d+\]) (\s+) +(.*)
Как-то так.
16.11.2011 в 23:25

> на всякий случай, а это может быть javasсript?

Вполне может.
16.11.2011 в 23:27

Sanctus Satanas
[0-9]{2}.[0-9]{3}
Точка же любой символ заматчит. Должно быть \.
16.11.2011 в 23:32

Моё сознанье несется ракетой в сторону солнца!!!
Trotil, ааа, спасибище, вы гений!!!! ))))))

Я правда еще вот такой вариант строки нашла
2011-10-25/05:34:59.230 [DefaultMessageListenerContainer-1] WARN Execution of JMS message listener failed

тогда получится вместо (\[Thread-\d+\]) надо будет (\[\s+\]) написать ? :)
16.11.2011 в 23:37

Моё сознанье несется ракетой в сторону солнца!!!
--==SS==--, мне вот принцип непонятен - то есть все символы, которые у нас 100% попадаются в строке на одних и тех же позициях (точки, двоеточия, скобки, тире) мы выделяем с двух сторон обратными слэшами ? или с одной? или как???
16.11.2011 в 23:42

> ааа, спасибище, вы гений!!!! ))))))

Это всё может быть неправда и не работать. Я не проверял.

> (\[\s+\])

Нет, (\[[\s\d]+\]), там еще цифры, а цифра (d), это не буква (s).
И я не знаю, работают ли в javasсript подобные сокращения (классы символов это называется). Но всегда можно написать множество, типа [0-9].
16.11.2011 в 23:48

Моё сознанье несется ракетой в сторону солнца!!!
Trotil, ладно, завтра попробую серваку на работе скормить, посмотрю что получится)
все-таки мне кажется должен быть альтернативный вариант проверки, а то мне кажется я гвозди микроскопом забиваю))
16.11.2011 в 23:57

Sanctus Satanas
SmiLena, не-не-не. Суть не в этом. Просто символ «точка» означает «любой символ». Т.е. это просто специальный символ. Чтобы специальный символ стал обычным (то есть в данном случае просто точкой), он предваряется бэкслешем. И наоборот — в тех контекстах, где символ не является специальным (например, s — это обычно просто латинская буква «s» в нижнем регистре), при добавлении бэкслеша он может оказаться специальным. :)
Примеры:
.* — означает «любое количество любых символов» (обычно максимально возможное количество)
[.*] — это означает «один символ — точка или звёздочка»
\. — одна точка
\.* — любое количество точек (в том числе ни одной)
[0-9] — один любой символ в диапазоне от 0 до 9
[09-] — один символ — ноль, девятка или минус
\[0-9\] — строка «[0-9]»
16.11.2011 в 23:59

> все-таки мне кажется должен быть альтернативный вариант проверки,
Есть.
Заготовьте текстовый файл с логом, и проверяйте его какой-нибудь небольшой самописной программулиной.
Сложно сказать, что будет удобно именно для вас. Существует множество способов.Есть даже плагин для Firefox )))
17.11.2011 в 00:11

Моё сознанье несется ракетой в сторону солнца!!!
--==SS==--, спасибо огромное!!! все стало понятно))))
а то я на RSDN пыталась читать и ничего не поняла там :shy:

Trotil, и вам спасибо)
17.11.2011 в 00:21

Моё сознанье несется ракетой в сторону солнца!!!
smll, и вам тоже)))))
там похоже свой язык на основе javasсript'а, но regexp для них совпадают
18.11.2011 в 11:01

65 108 101 120 97 110 100 101 114
для работы с xml в своем время пользовал XML Spy.
18.11.2011 в 16:44

Моё сознанье несется ракетой в сторону солнца!!!
([0123456789.:/-]{23}) (\[\w+-\d+\]) (ERROR|WARN) (.*)
вот такое я в итоге соорудила
18.11.2011 в 16:45

Sanctus Satanas
0123456789 — это же \d и есть. )