Expression régulière pour la correspondance exacte d'une chaîne

154

Je veux faire correspondre deux mots de passe avec une expression régulière. Par exemple, j'ai deux entrées "123456" et "1234567", alors le résultat ne devrait pas correspondre (faux). Et quand j'ai entré "123456" et "123456", le résultat devrait être égal (vrai).

Je n'ai pas pu faire l'expression. Comment fait-on ça?

Chirayu
la source
9
Pourquoi voulez-vous regex dans ce cas? La vérification de l'égalité (exacte) devrait vraiment être effectuée sans regex.
Bart Kiers
Parce que nous cherchons comment remplacer du texte dans un script Bash et obtenons une réponse qui implique Perl et regex.
sudo
ayant le même problème une meilleure solution ^ (123456) donnera les résultats que vous voulez
sdx11
Copie possible de la chaîne Match entière
Omer
@canbax Pourquoi serait-ce une question amusante exactement?
Milan Velebit

Réponses:

177

si vous avez un mot de passe d'entrée dans une variable et que vous voulez correspondre exactement à 123456, les ancres vous aideront:

/^123456$/

en perl, le test de correspondance du mot de passe serait quelque chose comme

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

ÉDITER:

bart kiers a raison, pourquoi n'utilisez-vous pas un strcmp () pour cela? chaque langue l'a à sa manière

en guise de seconde réflexion, vous voudrez peut-être envisager un mécanisme d'authentification plus sûr :)

utilisateur237419
la source
Merci pour les ancres, je le savais mais n'y pensais pas du tout :)
vikingsteve
2
Important : en Perl et PCRE, vous voulez à la \zplace de $. /^123456$/correspond aux deux 123456et 123456suivi d'un saut de ligne, tandis que /^123456\z/correspond uniquement 123456.
ikegami le
154

Dans la réponse de malfaux, «^» et «$» ont été utilisés pour détecter le début et la fin du texte.
Ceux-ci sont généralement utilisés pour détecter le début et la fin d'une ligne.
Cependant, cela peut être la bonne manière dans ce cas.
Mais si vous souhaitez faire correspondre un mot exact, la manière la plus élégante est d'utiliser '\ b' . Dans ce cas, le modèle suivant correspondra à l'expression exacte «123456».

/ \ b123456 \ b /

prageeth
la source
Êtes-vous sûr que cela fonctionne de cette façon? ;) Veuillez utiliser un testeur de regex comme celui-ci . Utilisez le bouton "Afficher la correspondance" et vous verrez pourquoi cela correspond. BTW souvenez-vous '.' est un caractère spécial et bon pour y échapper. (et bon de réfléchir à deux fois avant de voter: D).
prageeth le
2
Si vous pensez que ma réponse est trompeuse ou fausse, vous pouvez toujours publier votre propre réponse (comme d'autres personnes le font) ou placer un commentaire sous mon message expliquant votre suggestion.
prageeth le
26
Votre réponse est trompeuse et causera de graves problèmes à de nombreuses personnes. Par exemple, en utilisant votre approche \ bhttp: //www.foo.com \ b correspondra à http://www.bar.com/?http://www.foo.com , ce qui n'est certainement pas une correspondance exacte, car demandé dans le PO. Cela posera de sérieux problèmes aux personnes travaillant avec des URL ou des mots de passe (ce qui, encore une fois, est ce que l'OP a demandé) qui contiennent des caractères autres que des mots. Vous devez clarifier votre réponse afin que les autres ne soient pas induits en erreur.
0x1mason
2
Vous devrez expliquer. '.' est un hareng rouge. \ bhttp: // www \ .foo \ .com \ b produit toujours une correspondance pour http://www.bar.com/?http://www.foo.com . Ce n'est pas ce que veut le PO.
0x1mason
1
@ 0x1mason est correct \bhttp:\/\/www.foo.com\bet correspondra http://www.foo.com=?http://www.foo.comavec l'URL telle quelle . La première réponse, en utilisant le ^(début) et $(fin) est la meilleure méthode via ces testeurs: regex101.com et regexr.com (le testeur inclus dans un lien ci-dessous n'est pas très convivial, ils sont bien meilleurs)
twknab
34
(?<![\w\d])abc(?![\w\d])

cela garantit que votre correspondance n'est pas précédée d'un caractère, d'un chiffre ou d'un trait de soulignement et n'est pas immédiatement suivie d'un caractère ou d'un nombre, ou d'un trait de soulignement

donc il correspondra à "abc" dans "abc", "abc.", "abc", mais pas "4abc", ni "abcde"

Aedna
la source
1
Le titre de la question est trompeur; il essaie de s'assurer que deux chaînes entières sont exactement les mêmes. En outre, \wcorrespond aux chiffres et aux lettres, ce qui [\w\d]est redondant.
Alan Moore
agréable. voir regextester.com/?fam=113232 pour le "violon" que j'ai fait pour l'essayer
non synchronisé le
Les () autour des motifs m'ont aidé.
Ghazal le
6

Une manière plus simple consiste à vérifier l'égalité

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

cependant, si vous voulez vraiment vous en tenir à l'expression régulière,

string1 =~ /^123456$/
Kurumi
la source
@Kurumi J'essaie de créer du code java qui recherche un mot spécifique dans un fichier txt et je veux utiliser regx, je pourrais donc utiliser ce modèle / ^ myword $ / avec String.match (/ ^ myword $ /) pour rechercher le mot dans ce txt?
Antwan
3

Vous pouvez également essayer annexant un espace au début et à la fin du mot - clé: /\s+123456\s+/i.

Bhushan Lodha
la source