Domanda

Ho un regex ho bisogno di corrispondere contro un percorso in questo modo: "C:\Documents and Settings\User\My Documents\ScanSnap\382893.pd~". Ho bisogno di un'espressione regolare che corrisponde a tutti i percorsi ad eccezione di quelli che terminano in '~' o '.dat'. Il problema che sto avendo è che non capisco come abbinare e negare l'esatta stringa '.dat' e solo alla fine del percorso. vale a dire che non voglio corrispondere {d,a,t} in altre parti del percorso.

Ho costruito la regex, ma hanno bisogno di non corrispondere .dat

[\w\s:\.\\]*[^~]$[^\.dat]

[\w\s:\.\\]* Questo corrisponde a tutte le parole, gli spazi, i due punti, punti e backspace. Questo fa sì che [^~]$[^\.dat]$ partite che terminano in '~' a fallire. Sembra che dovrei essere in grado di seguire con un fiammifero negata per '.dat', ma la partita non riesce nel mio tester regex.

Credo che la mia risposta si trova nel raggruppamento a giudicare da quello che ho letto, avrebbe qualcuno indicarlo nel giusto senso? Devo aggiungere, sto usando un file a guardare programma che permette di corrispondenza regex, ho solo una riga per specificare l'espressione regolare.

Questa voce sembra simile: Regex per abbinare stringhe multiple

È stato utile?

Soluzione

Si desidera utilizzare un negativo look-ahead :

^((?!\.dat$)[\w\s:\.\\])*$

Tra l'altro, il tuo gruppo di caratteri ([\w\s:\.\\]) non consente una tilde (~) in esso. Hai intenzione di consentire una tilde nel nome del file se non fosse alla fine? Se è così:

^((?!~$|\.dat$)[\w\s:\.\\~])*$

Altri suggerimenti

La seguente espressione regolare:

^.*(?<!\.dat|~)$

corrisponde a qualsiasi stringa che non si esaurisce con un '~' o con '.dat'.

^             # the start of the string
.*            # gobble up the entire string (without line terminators!)
(?<!\.dat|~)  # looking back, there should not be '.dat' or '~'
$             # the end of the string

In parole povere:. abbinare una stringa solo quando guardando dietro dalla fine della stringa, non v'è alcun sub-string '.dat' o '~'

Modifica il motivo per cui il tentativo è fallito è perché una classe di caratteri negata, [^ ...] sarà solo negare un singolo carattere. Una classe di caratteri corrisponde sempre un singolo carattere. Quindi, quando si fa [^ .dat], non si sta negando la stringa ".dat" ma stai corrispondenza di un singolo carattere diverso da '', 'D', 'a' o 't'.

^((?!\.dat$)[\w\s:\.\\])*$

Questa è solo un commento su una risposta suggerimento precedente:

. all'interno di una classe di caratteri, [], è un letterale. e non ha bisogno di fuggire.

^((?!\.dat$)[\w\s:.\\])*$

Mi dispiace per pubblicare questo come una nuova soluzione, ma a quanto pare non hanno abbastanza credibilità per commentare semplicemente sulla ancora una risposta.

Credo che siete alla ricerca di questo:

[\w\s:\.\\]*([^~]|[^\.dat])$

che trova, come prima, tutti i caratteri di parola, lo spazio bianco, punti (.), Barre rovesciate. Poi partite sia per tilde (~) o '.dat' alla fine della stringa. Si consiglia inoltre di aggiungere un accento circonflesso (^), proprio all'inizio se si sa che la stringa dovrebbe essere all'inizio di una nuova linea.

^[\w\s:\.\\]*([^~]|[^\.dat])$
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top