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.