2014-09-19 8 views
1

J'ai une chaîne qui peut être une liste séparée par des virgules \w, tels que:Regexp pour capturer des valeurs séparées par des virgules

  • abc123
  • abc123, def456, ghi789

Je suis en train pour trouver une expression rationnelle JavaScript qui renverra ['abc123'] (premier cas) ou ['abc123', 'def456', 'ghi789'] (sans la virgule).

J'ai essayé:

  • ^(\w+,?)+$ - Non, car seul le dernier motif répétitif sera adapté, 789
  • ^(?:(\w+),?)+$ - Même chose. J'utilise un support non-capturant. Cependant, la capture ne semble pas se produire pour le mot répété

Est ce que j'essaye de faire même possible avec regexp? J'ai essayé à peu près toutes les combinaisons de regroupement, en utilisant la capture et les supports non-capture, et toujours pas réussi à ce qui se passe ...

+0

Qu'est-ce qui ne va pas avec 'string.split (',')'? – elclanrs

+0

Il sera divisé en fonction de ',', alors que je veux vérifier que les correspondances sont conformes à \ w – Merc

+0

Quel est le résultat attendu pour '= badstuff, goodstuff'? Avez-vous affaire à un mécanisme d'échappement dans des valeurs séparées par des virgules? – nhahtdh

Répondre

0

Si vous voulez jeter l'entrée tout quand il y a quelque chose de mal, la façon la plus simple est de valider, puis divisé:

if (/^\w+(,\w+)*$/.test(input)) { 
    var values = input.split(','); 

    // Process the values here 
} 

Si vous souhaitez autoriser la valeur vide, changer \w+ à \w*.

Essayer de faire correspondre et de valider en même temps avec une seule regex nécessite l'émulation de la fonctionnalité \G, qui affirme la position de la dernière correspondance. Pourquoi \G est-il requis? Comme il empêche le moteur de réessayer la correspondance à la position suivante et de contourner votre validation. Rappelez-vous que ECMA Script regex ne pas regarder en arrière, de sorte que vous ne pouvez pas faire la différence entre la position d'un caractère non valide et le caractère (s) après:

something,=bad,orisit,cor&rupt 
      ^^    ^^ 

Lorsque vous ne pouvez pas faire la différence entre la 2 positions, vous ne pouvez pas compter sur le moteur pour faire une opération de match-tout seul. Alors qu'il est possible d'utiliser une boucle while avec RegExp.exec et d'affirmer vous-même la position du dernier match, pourquoi le ferais-tu quand il y a une option plus propre?


Si vous voulez sauvage quelle que soit disponible, torazaburo's answer est une option viable.

0

Live demo

Essayez cette regex:

'/([^,]+)/' 

Alternativement, les chaînes en javascript ont une méthode de division qui peut diviser une chaîne basée sur un délimiteur:

s.split(',') 
+0

Mon Dieu, je suis un idiot. Merci ... – Merc

+0

Non, il arrive, vous êtes les bienvenus :) @Merc – CMPS

+0

Je veux réellement correspondre \ w spécifiquement. Donc, je suis venu avec ([\ w] * ,?) (qui ne me force pas non plus à avoir, à la fin). Ça m'a l'air bien? – Merc

-1

Peut être que vous pouvez utiliser diviser fonction

var st = "abc123,def456,ghi789"; 
var res = st.split(','); 
0

Split la première virgule, puis filtrer les résultats qui ne correspondent pas:

str.split(',').filter(function(s) { return /^\w+$/.test(s); }) 
0

Ce motif regex sépare la valeur numérique dans la nouvelle ligne qui contient des caractères spéciaux tels que ., ,, # et ainsi de suite.

var val = [1234,1213.1212, 1.3, 1.4] 
var re = /[0-9]*[0-9]/gi; 
+0

À quelle question répondez-vous? – Toto

0

var str = "abc123,def456, asda12, 1a2ass, yy8,ghi789"; 
 
var re = /[a-z]{3}\d{3}/g; 
 
var list = str.match(re); 
 
document.write("<BR> list.length: " + list.length); 
 
for(var i=0; i < list.length; i++) { 
 
\t document.write("<BR>list(" + i + "): " + list[i]); 
 
}

Cela ne recevra que "abc123" style de code dans la liste et rien d'autre.

Questions connexes