2017-01-11 2 views
0

Я буду первым, кто признает, что я не лучший писатель-регекс. Я пытаюсь проанализировать файлы журнала в powershell. Файлы журнала начинаются с отметки времени даты и могут быть многострочными. Примером может служить следующее:Регулярное выражение lookahead в powershell ведет себя странно

2017-01-10T17:52:24.224-05:00 DEBUG (0EC3-018C) < ThisIsAClassName> [blah] log lines are here 
    this is an addition to the previous line 
    So is this at 2017-01  
2017-01-10T17:52:26.224-05:00 DEBUG (0EC3-018C) < ThisIsADiffClassName> [blah] log lines are here 

Моя регулярное выражение выглядит следующим образом

Timestamp   = "\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}" 
Anything   = "[.|\w]" 
NegativeLookahead = "(?!(" + Timestamp + "))" 
FullRegex   = Timestamp + Anything + NegativeLookahead 

Это дает мне точно вход. Что я делаю неправильно, чтобы разделить строки по меткам времени?

+0

Нужно ли * совместить *? Вы можете разделить на '' (? M)^(? = "+ Timestamp +") "' –

+1

'[. | \ W]' выглядит неправильно, оно не соответствует «ничего», оно соответствует только символам слов, буквальным символ точки, символ буквальной трубы. – wOxxOm

+0

И только одно вхождение этого. –

ответ

1

Я понимаю, что вы имеете дело с многострочным содержимым. В этом случае гораздо проще раскол, а не матч:

"(?m)^(?=" + Timestamp + ")" 

Или, чтобы избежать пустой элемент в начале, добавьте (?!\A) предпросмотр до или после ^:

"(?m)(?!\A)^(?=" + Timestamp + ")" 

См regex demo

enter image description here

Это будет выглядеть (?m)^(?=\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}) в конце концов и будет соответствовать любому старту-строки позиции ((?m) многострочного модификатор сделает старт ^ матча строки, а не вся строки), которые следуют с рисунком временной метки но в текст временной метки не будет потребляться (= не будет частью значения соответствия и, таким образом, будет присутствовать в разделенном тексте), поскольку он используется внутри конструкции с положительной записью (?=...).

Смежные вопросы