Correspondre à la chaîne entière

165

Quelle est l'expression régulière (en JavaScript si cela compte) à ne correspondre que si le texte est une correspondance exacte? Autrement dit, il ne devrait y avoir aucun caractère supplémentaire à l'autre extrémité de la chaîne.

Par exemple, si je suis en train de faire correspondre pour abc, ensuite 1abc1, 1abcet abc1ne correspondrait pas.

Jake Pearson
la source
5
Pour ceux qui découvrent les regex, il y a deux bonnes réponses à cela, en fonction de ce que vous recherchez. Le demandeur veut vraiment \babc\b, ce qui permettrait par exemple de 123 abc 123faire correspondre pour abc(mais pas les exemples négatifs comme dans la question); cependant, ^abc$s'assurera que ac'est au début de la chaîne et cà la fin - sinon cela ne correspondra pas.
Andrew

Réponses:

305

Utilisez les délimiteurs de début et de fin: ^abc$

Howard
la source
3
@Jake, je suis heureux que la réponse de howards ait fonctionné, mais je pense que vous devriez noter que cela ne fonctionnera que si seul abc est le seul élément de la chaîne. Par exemple, cela ne correspondrait pas à `` les 3 premières lettres de l'alphabet sont abc ''
matchew
Cela a fonctionné pour moi, peut-être que mon exemple aurait dû être "abc def ghi" comme cible du match.
Jake Pearson le
@Jake si votre chaîne était "abc def ghi" alors / ^ abc $ / ne fonctionnerait pas. ex: jsfiddle.net/XUyAc
matchew le
2
Je comprends, si je veux correspondre à "abc def ghi", mon expression régulière serait^abc def ghi$
Jake Pearson
2
Remarque: pour qu'un motif avec des alternances corresponde à une chaîne entière, il peut être nécessaire de l'envelopper avec un (non) groupe de capture: /^(?:abc|def)$/ou /^(abc|def)$/. Sinon, si le groupe n'est pas utilisé, /^abc|def$/correspondra abcau début de la chaîne OU defà la fin de la chaîne.
Wiktor Stribiżew
40

Ça dépend. Vous pourriez

string.match(/^abc$/)

Mais cela ne correspondrait pas à la chaîne suivante: «les 3 premières lettres de l'alphabet sont abc. pas abc123 '

Je pense que vous voudriez utiliser \b(limites de mots):

var str = 'the first 3 letters of the alphabet are abc. not abc123';
var pat = /\b(abc)\b/g;
console.log(str.match(pat));

Exemple en direct: http://jsfiddle.net/uu5VJ/

Si l'ancienne solution fonctionne pour vous, je vous déconseille de l'utiliser.

Cela signifie que vous pouvez avoir quelque chose comme ce qui suit:

var strs = ['abc', 'abc1', 'abc2']
for (var i = 0; i < strs.length; i++) {
    if (strs[i] == 'abc') {
        //do something 
    }
    else {
        //do something else
    }
}

Alors que vous pourriez utiliser

if (str[i].match(/^abc$/g)) {
    //do something 
}

Ce serait beaucoup plus gourmand en ressources. Pour moi, une règle générale est pour une simple comparaison de chaînes d'utiliser une expression conditionnelle, pour un modèle plus dynamique, utilisez une expression régulière.

Plus d'informations sur les expressions régulières JavaScript: https://developer.mozilla.org/en/JavaScript/Guide/Regular_Expressions

matchew
la source
12
@NiharSawant C'est parce que ce n'est pas la réponse à la question posée par l'OP. L'OP ne veut clairement pas faire correspondre "'les 3 premières lettres de l'alphabet sont abc", et la deuxième solution ici ne fonctionne pas pour faire correspondre les expressions régulières générales, par exemple / ^ [abc] + $ /
DJClayworth