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 ...)
(2001) name
.Respostas:
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:
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:
fonte
\((?![\d]{4})[0-9a-zA-z _\.\-:]+\)
, ainda está(20019)
nele{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 _\.\-:]+\)
\((?![\d]{4} -->\)<--)[0-9a-zA-z _\.\-:]+\)
Aí tem um colchete que não está fechado, não é?)
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)
.Não exatamente, embora geralmente você possa usar alguma solução alternativa em um dos formulários
[^abc]
, que é caractere por caractere nãoa
oub
ouc
,a(?!b)
quea
não é seguido porb
(?<!a)b
queb
não é precedido pora
fonte
[^abc]
deve significar nãoa
oub
ouc
, não "não a stringabc
".