Domanda

Domanda facile questa volta.

Sto cercando di verificare se una stringa non contiene o meno un carattere usando espressioni regolari. Pensavo che l'espressione fosse nella forma " [^ x ] " dove x è il personaggio che non vuoi apparire, ma che sembra non funzionare.

Ad esempio,

Regex.IsMatch("103","[^0]")

e

Regex.IsMatch("103&","[^&]")

entrambi restituiscono true (mi aspetterei false).

Ho iniziato a usare " [^ & amp;] " e ho pensato che forse & amp; doveva essere evaso come \ & amp ;, ma non sembrava fare la differenza.

Idee? Suppongo sia qualcosa di piccolo.

Inoltre, sto usando .NET, quindi tienilo a mente.

Edit1:

Ho trovato questo , ma non sembra rispondere al problema che sto riscontrando.

Edit2:

Volevo rispondere a Kevin e I suggerimenti di Joel . Questi suggerimenti sarebbero davvero più veloci, ma non ottengono la flessibilità di cui ho bisogno in questo caso, quindi se hai trovato questa domanda attraverso la ricerca, sicuramente cerca di vedere se le loro risposte si adattano alle tue esigenze. Nel mio caso, l'espressione regolare viene passata a un metodo di convalida DataTable che scorre attraverso ogni riga e verifica che il contenuto di quella riga in una colonna specifica corrisponda al RegEx che viene passato. Dal momento che userò di nuovo questo metodo per diversi altri DataTable in fase di convalida, ho voluto:

  1. Utilizza Regex per abilitare la più ampia gamma di convalide e
  2. Cerca sempre una corrispondenza positiva (ovvero invece di usare! Regex.IsMatch (cella, regexvariable), ho voluto fare affidamento sul fatto di poter sempre utilizzare Regex.IsMatch (cella, regexvariable) poiché la maggior parte delle tabelle dati che invocano questo metodo utilizzerà la corrispondenza positiva anziché negativa.

Speriamo che sia d'aiuto.

È stato utile?

Soluzione

La tua soluzione è metà giusta. La partita che vedi è per gli altri personaggi. Quello che vuoi dire è qualcosa come " ehi! Non voglio vedere questo personaggio nell'intera stringa " ;.

In tal caso lo fai:

Regex.IsMatch("103","^[^0]*<*>quot;)

Altri suggerimenti

Il modello [^ 0] corrisponderà a qualsiasi carattere diverso da zero. In entrambi i tuoi esempi, il modello corrisponderà al primo carattere (" 1 "). Per verificare se l'intera stringa non contiene zeri, il modello deve essere " ^ [^ 0] * $ " ;. Questo è il seguente: Inizia all'inizio della stringa, abbina un numero arbitrario di caratteri che non sono zeri, seguito immediatamente dalla fine della stringa. Qualsiasi stringa contenente uno zero avrà esito negativo. Passerà qualsiasi stringa che non contiene zeri.

se stai cercando un singolo carattere in una stringa, regex sembra un po 'eccessivo. Perché non usare semplicemente .IndexOf o .Contains?

Il primo carattere che raggiunge il parser è " 1 " ;, che è vero per [^ 0] e vero anche per [^ & amp;], quindi quindi tornerà vero in entrambi questi esempi.

Stai mettendo la tua negazione nel posto sbagliato. [^ x] corrisponderà a tutto ciò che non è x. Se x è nella stringa, la stringa corrisponde comunque all'espressione se ci sono anche altri caratteri. Invece, si desidera far corrispondere true se x è presente, quindi negare il risultato della funzione:

Not Regex.IsMatch("103", "0")

Not Regex.IsMatch("103&", "&")

Non che con questi semplici esempi, la normale String.IndexOf () o String.Contains () sarebbe una scelta migliore.

Mi sono imbattuto in questa domanda cercando la stessa cosa ma JavaScript. L'espressione sopra non ha funzionato nel mio caso, ma mi sono imbattuta nell'espressione sotto che ha funzionato. (Nel caso in cui qualcun altro alla ricerca di una soluzione JavaScript finisca anche qui.)

^ ((?! 0).) * $

Questo costrutto è chiamato Lookahead negativo

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top