2010-04-28 14 views
6

tengo unas pocas expresiones regulares:expresión regular para representar "NO" en un grupo

<(\d+)>(\w+\s\d+\s\d+(?::\d+){2})\s([\w\/\.\-]*)(.*) 

Lo que quiero hacer es volver FALSO (no emparejado) si el tercer grupo es "MSWinEventLog" y que vuelve "emparejado" para el resto.

<166>Apr 28 10:46:34 AMC the remaining phrase 
<11>Apr 28 10:46:34 MSWinEventLog the remaining phrase 
<170>Apr 28 10:46:34 Avantail the remaining phrase 
<171>Apr 28 10:46:34 Avantail the remaining phrase 
<172>Apr 28 10:46:34 AMC the remaining phrase 
<173>Apr 28 10:46:34 AMC the remaining phrase 
<174>Apr 28 10:46:34 Avantail the remaining phrase 
<175>Apr 28 10:46:34 AMC the remaining phrase 
<176>Apr 28 10:46:34 AMC the remaining phrase 
<177>Apr 28 10:46:34 Avantail the remaining phrase 
<178>Apr 28 10:46:34 AMC the remaining phrase 
<179>Apr 28 10:46:34 Avantail the remaining phrase 
<180>Apr 28 10:46:34 Avantail the remaining phrase 

¿Cómo poner "NO 'MSWinEventLog'" en el grupo de expresiones regulares ([\w\/\.\-]*)?

Nota:
La segunda frase anterior debería devolver "no emparejado"

Respuesta

8
<(\d+)>(\w+\s\d+\s\d+(?::\d+){2})\s(?!MSWinEventLog)([\w\/\.\-]*)(.*) 

un negative lookahead (aquí: '(?!MSWinEventLog)') debe ser suficiente:

búsqueda negativa hacia delante es indispensable si quiere hacer coincidir algo no seguido por otra cosa.
Al explicar las clases de caracteres, ya expliqué por qué no puede usar un character class negado para que coincida con una "q" que no va seguida de una "u". Negative lookahead proporciona la solución: q(?!u).

+0

Haha Esta es la respuesta exacta que quiero. De todas maneras, muchas gracias. –

1

Puede hacerlo con búsqueda negativa hacia delante:

<(\d+)>(\w+\s\d+\s\d+(?::\d+){2})\s(?!MSWinEventLog)([\w\/.-])(.) 
            ----------------- 

(?!MSWinEventLog) coincidirá sólo si no seguido inmediatamente por una expresión juego "MSWinEventLog".

+0

Esto también es correcto. Gracias –

Cuestiones relacionadas