2013-07-11 15 views
6

Ho una regex che trova gli errori in un registro per me:Come si rifiuta una stringa se preceduta da un'altra stringa utilizzando regex standard POSIX?

/(exception|error)/i 

Questo funziona, solo che io non voglio ricevere un avviso quando si verifica quanto segue, che mi aspetto che accada:

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

Come faccio a rifiutare in modo specifico la stringa "Leggi l'eccezione incontrata"? Sto cercando di usare il?! operatore, ma in mancanza:

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

Quanto sopra corrisponde ancora alla stringa che voglio escludere.

UPDATE: Dopo aver sperimentato le soluzioni lookbehind e lookahead negativo al di sotto, ho scoperto che SiteScope supporta solo funzioni POSIX espressioni regolari di base, caratteristiche non estese. È possibile una soluzione utilizzando solo le caratteristiche regex di base POSIX?

+0

Quale linguaggio di programmazione? – Doorknob

+0

Non ne sono sicuro. Sto usando SiteScope. Regex standard? –

risposta

4

Si desidera utilizzare "Negative Lookbehind" (se è supportato dal proprio motore regex). In pratica si dice "Voglio abbinare X patern, purché questo altro modello NON lo preceda".

Nel tuo esempio, sembra che questo:

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

vedere di più su "Lookaround" caratteristiche here.

+0

L'espressione '(?

+0

Sembra che SiteScope non supporti Negative Lookbehind, ma ancora +1 per la vostra assistenza - questa è una soluzione probabile per gli altri che trovano questa domanda. –

0

Forse il carattere di "inizio della linea" è quello che ti serve. Sto assumendo che ogni riga del registro abbia "eccezione" o "errore". Così si potrebbe abbinare per

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

Ciò partita in ogni messaggio di eccezione o un errore che sta seguendo direttamente il timestamp. Se c'è un "Leggi" tra il timestamp e (eccezione | errore) non corrisponderà.

+0

Non so che l'eccezione | errore seguirà direttamente il timestamp. Quindi questo fallirebbe se il messaggio fosse "(timestamp): Oh diavolo tutto è in fiamme a causa di un errore" –

1

Se si sta cercando di rifiutare l'intera stringa se la stringa secondaria Read exception encountered si trova nella stringa, utilizzare semplicemente uno sguardo negativo avanti che è supportato dalla maggior parte delle lingue.

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

vivo esempio: http://www.rubular.com/r/CV7P9huVsI

enter image description here

1

provare qualcosa di simile /([^ R] [^ e] [^ a] [^ d]) (eccezione | errore)/

Problemi correlati