Espressione regolare per la corrispondenza esatta di una stringa


153

Voglio abbinare due password con espressione regolare. Ad esempio ho due ingressi "123456" e "1234567", quindi il risultato non deve corrispondere (falso). E quando ho inserito "123456" e "123456", il risultato dovrebbe essere match (true).

Non sono riuscito a fare l'espressione. Come lo faccio?


9
Perché vuoi regex in questo caso? Controllare l'uguaglianza (esatta) dovrebbe davvero essere fatto senza regex.
Bart Kiers,

Perché cerchiamo come sostituire il testo in uno script Bash e ottenere una risposta che coinvolge Perl e regex.
sudo,

avere lo stesso problema con una soluzione migliore ^ (123456) fornirà i risultati desiderati
sdx11

Possibile duplicato dell'intera stringa
Omer,

@canbax Perché questa dovrebbe essere una domanda divertente esattamente?
Milan Velebit,

Risposte:


177

se hai una password di input in una variabile e vuoi abbinare esattamente 123456, gli ancoraggi ti aiuteranno:

/^123456$/

in perl il test per abbinare la password sarebbe qualcosa di simile

print "MATCH_OK" if ($input_pass=~/^123456$/);

MODIFICARE:

bart kiers ha ragione, perché non usi strcmp () per questo? ogni lingua lo ha a modo suo

come secondo pensiero, potresti prendere in considerazione un meccanismo di autenticazione più sicuro :)


Grazie per le ancore, lo sapevo ma non ci ho pensato del tutto :)
vikingsteve il

2
Importante : in Perl e PCRE, \zinvece di $. /^123456$/corrisponde a entrambi 123456e 123456seguito da un avanzamento riga, mentre /^123456\z/solo le partite 123456.
ikegami,

154

Nella risposta di Malfaux '^' e '$' sono stati usati per rilevare l'inizio e la fine del testo.
Di solito vengono utilizzati per rilevare l'inizio e la fine di una riga.
Tuttavia, questo può essere il modo corretto in questo caso.
Ma se desideri abbinare una parola esatta, il modo più elegante è usare '\ b' . In questo caso, il modello seguente corrisponderà alla frase esatta "124545".

/ \ B123456 \ b /


Sei sicuro che funzioni in quel modo? ;) Utilizzare un tester regex come questo . Usa il pulsante "mostra partita" e vedrai perché corrisponde. BTW ricorda '.' è un personaggio speciale e buono per evitarlo. (e bello pensarci due volte prima di votare in basso: D).
prageeth il

2
Se ritieni che la mia risposta sia fuorviante o sbagliata, puoi comunque pubblicare la tua risposta (come fanno altre persone) o inserire un commento sotto il mio post che spieghi il tuo suggerimento.
Prageeth

26
La tua risposta è fuorviante e causerà a molte persone seri problemi. Ad esempio, usando il tuo approccio \ bhttp: //www.foo.com \ b corrisponderai a http://www.bar.com/?http://www.foo.com , che sicuramente non è una corrispondenza esatta, poiché richiesto nel PO. Ciò causerà seri problemi alle persone che lavorano con URL o password (che, di nuovo, è ciò che l'OP ha richiesto) che contengono caratteri non di parole. Dovresti chiarire la tua risposta in modo che gli altri non siano fuorviati.
0x1,

2
Dovrai spiegare. '' è un'aringa rossa. \ bhttp: // www \ .foo \ .com \ b produce ancora una corrispondenza per http://www.bar.com/?http://www.foo.com . Non è quello che vuole l'OP.
0x1mason

1
@ 0x1mason è corretto che \bhttp:\/\/www.foo.com\bcorrisponderà http://www.foo.com=?http://www.foo.comcon l'URL così com'è. La prima risposta, utilizzando ^(inizio) e $(fine) è il metodo migliore tramite questi tester: regex101.com e regexr.com (il tester incluso in un link di seguito non è molto
intuitivo

34
(?<![\w\d])abc(?![\w\d])

questo assicura che la tua corrispondenza non sia preceduta da un carattere, numero o carattere di sottolineatura e non sia seguita immediatamente da carattere o numero o carattere di sottolineatura

quindi corrisponderà a "abc" in "abc", "abc.", "abc", ma non "4abc", né "abcde"


1
Il titolo della domanda è fuorviante; sta cercando di assicurarsi che due intere stringhe siano esattamente le stesse. Inoltre, \wcorrisponde a cifre e lettere, quindi [\w\d]è ridondante.
Alan Moore,

simpatico. vedi regextester.com/?fam=113232 per "violino" che ho fatto per provarlo
non sincronizzato il

I () modelli intorno mi hanno aiutato.
Ghazal

6

Un modo più diretto è verificare l'uguaglianza

if string1 == string2
  puts "match"
else
  puts "not match"
end

tuttavia, se vuoi davvero attenerti all'espressione regolare,

string1 =~ /^123456$/

@Kurumi Sto provando a creare un codice Java che cerca una parola specifica nel file txt e voglio usare regx così potrei usare quel modello / ^ myword $ / con String.match (/ ^ myword $ /) per cercare il parola in quel txt?
Antwan,

3

Si può anche provare aggiungendo uno spazio all'inizio e alla fine della parola chiave: /\s+123456\s+/i.

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.