2014-05-19 3 views
1

Мне нужно использовать регулярное выражение ("filter = regexp" в NSClient ++), чтобы получить определенную строку (помеченную «< -»), если есть NO $ -sign внутри. Ниже приведен пример того, как выглядит текст, в котором я должен искать (это описание представляет собой журнал событий).Нужна помощь при создании регулярного выражения (NSClient ++)

A member was added to a security-enabled global group 

Subject: 
    Security ID: ... 
    Account Name: ... 
    Account Domain: ... 
    Logon ID: ... 

Member: 
    Security ID: ... <-- 
    Account Name: ... 

Group: 
    Security ID: ... 
    Group Name: ... 
    Group Domain: ... 

Additional Information: 
    ... 

Таким образом, если линия, которая начинается с «Security ID» внутри «член» не содержит знак $ то мне нужно вывод регулярных выражений, чтобы быть «Security ID: ...» иначе выход не должен быть.

Я попробовал несколько разные вещи, но я не получаю я работаю совершенно прав:

/(?<=Member:[\n]).*(Security ID:((?![$]).)*)(?=[\n].*Account Name:)/s 

-> Неправильно, если есть линия между «ID безопасности ...» и «Имя учетной записи. .. "и швов, чтобы вернуть два матча.

Так что, может быть, кто-то может мне помочь. ;)

ОБНОВЛЕНИЕ: Как это сделать, если между «Участником» и «Идентификатором безопасности» может быть несколько линий?

UPDATE2: На самом деле это то, что я имел в виду:

/(?m)^(?<=Member:[\n])(?:.|\n)*?(Security ID:[^$\n]*$)(?:.|\n)*?(?=Group:[\n])/ 

Спасибо за вашу помощь Робин & AdamK иначе я все еще ищет, чтобы получить это право! :)

Привет, Седрик

+0

Если есть строка между Sec ID и Acc number, тогда я ничего не получаю для соответствия. – AdamK

+0

Я только пробовал его здесь: http://regex101.com/#python и здесь: http://regex101.com/#pcre – Dobi

+0

@Dobi: Fyi on regex101 вы добросовестно делитесь своим конкретным примером, нажимая Ctrl + S или нажав «Сохранить regex» слева – Robin

ответ

1

Твердая часть отличить одну секцию (Subject, Member ...) от другого: мы не хотим, чтобы соответствовать любойSecurity ID. Это регулярное выражение полагается на два отступа пространства, чтобы отличить их.

Желаемая линия фиксируется в первой группе захвата, см. demo here.

(?m)Member:\n(?: .*\n|\n)*?(^ *Security ID:[^$\n]*$) 
  • (?m) только рядный способ включения флага многострочного m
  • ^[^$\n]*$ матчи только строки, не содержащие $
  • \S соответствует ничего, кроме каких-либо пробелов (без символа новой строки, табуляция .. .)
  • (?: \S.*\n)*? соответствует любому количеству строк с отступом в два пробега
Смежные вопросы