web-dev-qa-db-fra.com

Regex pour extraire la sous-chaîne, renvoyant 2 résultats pour une raison quelconque

J'ai besoin de faire beaucoup de choses regex en javascript, mais j'ai quelques problèmes avec la syntaxe et je n'arrive pas à trouver une ressource définitive à ce sujet .. pour une raison quelconque quand je le fais:

var tesst = "afskfsd33j"
var test = tesst.match(/a(.*)j/);
alert (test)

ça montre

"afskfsd33j, fskfsd33"

Je ne sais pas pourquoi il donne cette sortie d'original et la chaîne correspondante, je me demande comment je peux l'obtenir pour qu'il corresponde simplement à la correspondance (en extrayant essentiellement la partie que je veux de la chaîne d'origine)

Merci pour tout conseil

51
Rick

match renvoie un tableau.

La représentation sous forme de chaîne par défaut d'un tableau en JavaScript est constituée des éléments du tableau séparés par des virgules. Dans ce cas, le résultat souhaité se trouve dans le deuxième élément du tableau:

var tesst = "afskfsd33j"
var test = tesst.match(/a(.*)j/);
alert (test[1]);
89
Jacob Relkin

Je pense que votre problème est que la méthode de correspondance renvoie un tableau. Le 0ème élément du tableau est la chaîne d'origine, les 1er à nième correspond aux 1er à nièmes éléments entre parenthèses. Votre appel "alert ()" affiche l’ensemble du tableau.

5
BillP3rd

Chaque groupe défini entre parenthèses () est capturé pendant le traitement et chaque contenu de groupe capturé est inséré dans le tableau de résultats dans le même ordre que celui du début du groupe. En voir plus sur http://www.regular-expressions.info/brackets.html et http://www.regular-expressions.info/refcapture.html (choisissez bon langage pour voir les fonctionnalités supportées)

var source = "afskfsd33j"
var result = source.match(/a(.*)j/);

result: ["afskfsd33j", "fskfsd33"]

La raison pour laquelle vous avez reçu ce résultat exact est la suivante:

La première valeur dans array est la première chaîne trouvée qui confirme le motif complet. Donc, il devrait certainement commencer par "a" suivi d'un nombre quelconque de caractères et se terminer par le premier "j" après le début de "a".

La deuxième valeur du tableau est un groupe capturé défini par des parenthèses. Dans votre groupe de cas, il y a une correspondance complète de motif sans contenu défini en dehors des parenthèses, donc exactement "fskfsd33".

Si vous voulez vous débarrasser de la deuxième valeur du tableau, vous pouvez définir un motif comme ceci:

/a(?:.*)j/

où "?:" signifie que le groupe de caractères qui correspond au contenu entre parenthèses ne fera pas partie du tableau résultant.

D'autres options peuvent être dans ce cas simple d'écrire un motif sans groupe car il n'est pas nécessaire d'utiliser un groupe:

/a.*j/

Si vous voulez simplement vérifier si le texte source correspond au motif et ne vous souciez pas du texte trouvé, essayez:

var result = /a.*j/.test(source);

Le résultat doit alors renvoyer uniquement les valeurs true | false. Pour plus d'informations, voir http://www.javascriptkit.com/javatutors/re3.shtml

4
Jan Stanicek

Je viens d'avoir le même problème.

Vous n'obtenez le texte deux fois dans votre résultat que si vous incluez un groupe de correspondance (entre parenthèses) et le modificateur 'g' (global). Le premier élément correspond toujours au premier résultat, normalement OK lorsque vous utilisez match (reg) sur une chaîne courte, mais lorsque vous utilisez une construction telle que:

while ((result = reg.exec(string)) !== null){
    console.log(result);
}

les résultats sont un peu différents.

Essayez le code suivant:

var regEx = new RegExp('([0-9]+ (cat|fish))','g'), sampleString="1 cat and 2 fish";
var result = sample_string.match(regEx);
console.log(JSON.stringify(result));
// ["1 cat","2 fish"]

var reg = new RegExp('[0-9]+ (cat|fish)','g'), sampleString="1 cat and 2 fish";
while ((result = reg.exec(sampleString)) !== null) {
    console.dir(JSON.stringify(result))
};
// '["1 cat","cat"]'
// '["2 fish","fish"]'

var reg = new RegExp('([0-9]+ (cat|fish))','g'), sampleString="1 cat and 2 fish";
while ((result = reg.exec(sampleString)) !== null){
    console.dir(JSON.stringify(result))
};
// '["1 cat","1 cat","cat"]'
// '["2 fish","2 fish","fish"]'

(testé sur V8 récent - Chrome, Node.js)

La meilleure réponse est actuellement un commentaire que je ne peux pas voter, merci à @Mic.

3
techturbulence

Débarrassez-vous de la parenthèse et cela vous donnera un tableau avec un élément et:

  • Changer cette ligne

var test = tesst.match (/ a (. *) j /);

  • Pour ça

var test = tesst.match (/a.*j/);

Si vous ajoutez des parenthèses, la fonction match () trouvera deux correspondances pour vous, une pour l'expression entière et une pour l'expression entre parenthèses.

  • Toujours selon developer.mozilla.org docs:

Si vous voulez seulement que la première correspondance soit trouvée, vous pouvez utiliser plutôt RegExp.exec ().

Vous pouvez utiliser le code ci-dessous:

RegExp (/a.*j /). Exec ("afskfsd33j")

2
Ekrami