2017-07-03 1 views
2

J'ai ce code, mais maintenant j'essaie de ne faire correspondre les nombres qu'une seule fois.Faire correspondre les nombres dans une chaîne seulement une fois

var text = "91308543 v1_Printer 91308543 v2 91503362 v1_Printer"; 
var regex = /9\d{7}/g; 

var result = text.match(regex); 

var pos0 = result[0]; 
var pos1 = result[1]; 
var pos2 = result[2]; 

return(pos0 + " " + pos1 + " " + pos2); 

Le résultat est: 91308543 91308543 91503362

Résultat Je veux: 91308543 91503362

Il est possible d'ajouter quelque chose à mon regex il ne montre pas les valeurs en double? Je préfère ne pas utiliser les tableaux car dans ce cas j'ai besoin d'utiliser des tableaux natifs ...

J'ai aussi une deuxième question, il est possible de créer les variables "pos0", "pos1" ... automatiquement?

Merci!

+0

Il est possible, mais il est préférable de filtrer le tableau de résultats. –

+0

Peut-être '(9 \ d {7}) (?!. * \ 1)' – horcrux

+0

Sachez que '" 9876511392222332 "' sera divisé en deux matchs. – RoJaIt

Répondre

0

Le regex que vous recherchez est

(9\d{7})\b(?!.*\1\b) 

Il utilise negative lookahead. Voir demo.

Le deuxième point est réalisable grâce eval:

var result = text.match(regex); 
for (var i = 0; i < result.length; i++){ 
    eval('var pos' + i + ' = "' + result[i] + '"'); 
} 

mais cela ne vous aide pas à la déclaration de retour.

Vous devez simplement utiliser:

return(result.join(" ")); 
+0

Fonctionne parfaitement! Merci! – Kayra

0

Vous pouvez filter les doublons après l'appariement, et utiliser un destructuring assingment pour assigner à des variables individuelles:

let text = "91308543 v1_Printer 91308543 v2 91503362 v1_Printer"; 
 
let regex = /9\d{7}/g; 
 
let [pos0, pos1, pos2] = text.match(regex).filter((v, i, a) => a.indexOf(v) === i); 
 

 
console.log(pos0); 
 
console.log(pos1); 
 
console.log(pos2);

0

Essayez ce modèle (9\d{7})(?!.*\1) .Son lookahead négatif ne permet pas le double

Demo regex

For more reference

var text = "91308543 v1_Printer 91308543 v2 91503362 v1_Printer"; 
 
var regex = /(9\d{7})(?!.*\1)/g; 
 

 
var result = text.match(regex); 
 

 
console.log(result)