2013-07-11 12 views
6

Mam regex, który znajdzie błędy w dzienniku dla mnie:Jak odrzucić ciąg, jeśli jest poprzedzony innym ciągiem przy użyciu standardowego wyrażenia regularnego w standardzie POSIX?

/(exception|error)/i 

To działa, z wyjątkiem, że nie chcą być powiadamiani w następujących przypadkach, które spodziewam się zdarzyć:

DD/MM/YYYY 10:20pm: Read exception encountered 

Jak konkretnie odrzucić ciąg "Znaleziono napotkany wyjątek"? Próbuję użyć?! operator, ale błąd:

/(?!Read exception encountered)(exception|error)/i 

Powyższe nadal pasuje do ciągu, który chcę wykluczyć.

UPDATE: Po eksperymentach z negatywnymi lookbehind i uprzedzona poniżej rozwiązań, odkryłem, że SiteScope obsługuje tylko podstawowe funkcje POSIX regex, nie obejmuje możliwości. Czy możliwe jest rozwiązanie przy użyciu tylko podstawowych funkcji wyrażeń regularnych POSIX?

+0

Jaki język programowania? – Doorknob

+0

Nie jestem pewien. Używam SiteScope. Standardowy Regex? –

Odpowiedz

4

Chcesz użyć "Negatywnego Lookbehinda" (jeśli jest obsługiwany przez twój silnik wyrażeń regularnych). Skutecznie mówisz "Chcę dopasować X patern, o ile ten inny wzór NIE je poprzedza."

W przykładzie wygląda to tak:

/(?<!read)(exception|error)/i 

dowiedzieć się więcej o "lookaround" cech here.

+0

Wyrażenie "(?

+0

Wygląda na to, że SiteScope nie obsługuje negatywnego Lookbehind, ale nadal daje +1 dla twojej pomocy - jest to prawdopodobne rozwiązanie dla innych osób, które znajdują to pytanie. –

0

Być może potrzebna jest postać "początku linii". Zakładam, że każda linia dziennika zawiera "wyjątek" lub "błąd". więc można dopasować do

/^(RegexpForDateTimeGoesHere)(exception|error)/i 

To będzie pasował na każdą wiadomość wyjątku lub błędów, które jest bezpośrednio następującego znacznika czasu. Jeśli pomiędzy znacznikiem czasowym a (wyjątkiem | error) istnieje "Odczyt", nie będzie on zgodny.

+0

Nie wiem, że wyjątek | error będzie bezpośrednio podążał za znacznikiem czasu. Tak by się nie udało, gdyby wiadomość brzmiała "(znacznik czasu): O, cholera, wszystko jest w ogniu z powodu błędu" –

1

Jeśli chcesz odrzucić cały ciąg znaków, jeśli podtytuł Read exception encountered jest w łańcuchu, to po prostu użyłbym negatywnego spojrzenia, który jest obsługiwany przez większość języków.

^(?![^\r\n]*?\bRead exception encountered\b)[^\r\n]*?(exception|error)

żywo przykład: http://www.rubular.com/r/CV7P9huVsI

enter image description here

1

Spróbuj coś takiego /([^ r] [^ e] [^ a] [^ d]) (z wyjątkiem | Błąd)/

Powiązane problemy