Regex non operatore


109

Esiste un operatore NOT nelle espressioni regolari? Come in quella stringa:"(2001) (asdf) (dasd1123_asd 21.01.2011 zqge)(dzqge) name (20019)"

Voglio eliminare tutti \([0-9a-zA-z _\.\-:]*\)ma non quello in cui si tratta di un anno: (2001).

Così che cosa l'espressione regolare deve restituire deve essere: (2001) name.

NOTA: qualcosa di simile \((?![\d]){4}[0-9a-zA-z _\.\-:]*\)non funziona per me (in (20019)qualche modo corrisponde anche ...)


1
C'è una stringa come sopra e voglio regex in su, che il risultato del regex è: (2001) name.
Sonnenhut

Risposte:


112

No, non esiste un operatore non diretto. Almeno non nel modo in cui speri.

Tuttavia, puoi utilizzare un lookahead negativo di larghezza zero:

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

La (?!...)parte significa "corrisponde solo se il testo che segue (quindi: lookahead) questo non (quindi: negativo) corrisponde a questo. Ma in realtà non consuma i caratteri a cui corrisponde (quindi: larghezza zero).

In realtà ci sono 4 combinazioni di lookaround con 2 assi:

  • lookbehind / lookahead: specifica se vengono considerati i caratteri prima o dopo il punto
  • positivo / negativo: specifica se i caratteri devono corrispondere o non devono corrispondere.

Grazie del?! è quello che stavo suggerendo anch'io, ma comunque se lo uso \((?![\d]{4})[0-9a-zA-z _\.\-:]+\)c'è ancora (20019)dentro
Sonnenhut

Nella modifica della tua domanda metti l' {4} esterno del lookahead e in questo commento lo metti dentro : quale hai provato? Inoltre: se vuoi (20019)abbinare, devi aggiungere l' \) interno del tuo lookahead:\((?![\d]{4}\))[0-9a-zA-z _\.\-:]+\)
Joachim Sauer

Con la regex sopra nel tuo commento, funziona. Ma non capisco che ... Non capisco perché scappi dalla parte seguente \((?![\d]{4} -->\)<--)[0-9a-zA-z _\.\-:]+\)Poi c'è una staffa non chiusa, no?
Sonnenhut

Esco dalla parentesi di chiusura )perché voglio abbinare il carattere letterale) (proprio come fai all'inizio e alla fine della tua regex!). Quindi, dopo averlo abbinato, concludo il lookahead utilizzando un carattere senza escape ).
Joachim Sauer

Fatto. Ero un po 'confuso da tutti quei personaggi. Grazie.
Sonnenhut

183

Non esattamente, anche se in genere è possibile utilizzare una soluzione alternativa su uno dei moduli

  • [^abc], che è carattere per carattere non ao bo c,
  • o lookahead negativo:, a(?!b)che anon è seguito dab
  • o lookbehind negativo:, (?<!a)bche bnon è preceduto daa

Sì, penso che il look-behind negativo sia (? <! A) b - riferimento: regular-expressions.info/lookaround.html
jankins

8
Ma [^abc]dovrebbe significare no ao bor c, non "non la stringa abc".
Piove
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.