Regex não operador


109

Existe um operador NOT no Regexes? Como naquela string:"(2001) (asdf) (dasd1123_asd 21.01.2011 zqge)(dzqge) name (20019)"

Eu quero excluir todos \([0-9a-zA-z _\.\-:]*\), mas não aquele onde é um ano: (2001).

Então, o que a regex deve retornar deve ser: (2001) name.

NOTA: algo como \((?![\d]){4}[0-9a-zA-z _\.\-:]*\)não funciona para mim (de (20019)alguma forma também corresponde ...)


1
Há uma String como acima e quero regex-lo, que o resultado do regex é: (2001) name.
Sonnenhut

Respostas:


112

Não, não há nenhuma operadora direta. Pelo menos não da maneira que você espera.

Você pode usar um lookahead negativo de largura zero, no entanto:

\((?!2001)[0-9a-zA-z _\.\-:]*\)

A (?!...)parte significa "apenas corresponde se o texto a seguir (daí: lookahead) não (daí: negativo) corresponder a isso. Mas, na verdade, não consome os caracteres aos quais corresponde (daí: largura zero).

Na verdade, existem 4 combinações de lookarounds com 2 eixos:

  • lookbehind / lookahead: especifica se os caracteres antes ou depois do ponto são considerados
  • positivo / negativo: especifica se os caracteres devem corresponder ou não .

Obrigado o?! é o que eu estava sugerindo também, mas de qualquer forma, se eu usar \((?![\d]{4})[0-9a-zA-z _\.\-:]+\), ainda está (20019)nele
Sonnenhut

Na edição da sua pergunta você colocou o {4} fora do lookahead e neste comentário você colocou dentro : qual você tentou? Além disso: se quiser (20019)corresponder, você deve adicionar o \) interior da sua antevisão:\((?![\d]{4}\))[0-9a-zA-z _\.\-:]+\)
Joachim Sauer

Com a regex acima em seu comentário, funciona. Mas eu não entendo isso ... não entendo porque você foge da parte seguinte \((?![\d]{4} -->\)<--)[0-9a-zA-z _\.\-:]+\)Aí tem um colchete que não está fechado, não é?
Sonnenhut

Eu escapei do parêntese de fechamento )porque desejo corresponder ao caractere literal) (assim como você faz no início e no final de sua regex!). Então, depois de combinar isso, termino a análise à frente usando um sem escape ).
Joachim Sauer

Entendi. Fiquei um pouco confuso com todos aqueles personagens. Obrigado.
Sonnenhut

183

Não exatamente, embora geralmente você possa usar alguma solução alternativa em um dos formulários

  • [^abc], que é caractere por caractere não aou bou c,
  • ou lookahead negativo:, a(?!b)que anão é seguido porb
  • ou lookbehind negativo:, (?<!a)bque bnão é precedido pora

Sim, eu acho negativo olhar-behind é b - referência (<a?!): Regular-expressions.info/lookaround.html
Jankins

8
Mas [^abc]deve significar não aou bou c, não "não a string abc".
Chovendo
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.