2010-12-12 43 views
2

J'ai une chaîne avec un champ comme ceci: id = "ID-120-1, ID-141-5, ID-92-5, N/A"groupes de capture Repeating nommés

Je voudrais pour capturer seulement les "ID" à un groupe de capture nommé (c'est-à-dire sans le "N/A" ou d'autres éléments qui pourraient s'insinuer). Je pensais que cela pourrait fonctionner, mais pas de chance:

\bid=\"(?<id>(ID-\d+-\d+)+) 

Des idées?

Répondre

1

L'expression que vous utilisez retourne seul parce que vous comptez sur le début de l'id être présent devant chaque valeur d'identifiant. L'ajustement suivant devrait corriger cela.

(?:(?:=\")|(?:,\s))(?<id>(?:ID-\d+-\d+)*) 

Une autre option serait de laisser tomber juste l'id = « vérifier partie tous ensemble

(?<id>(?:ID-\d+-\d+)) 

Ou vous pouvez ajouter le », "vérifier à la fin de l'identifiant pour vous assurer que vous êtes dans l'attribut.

(?<id>(?:ID-\d+-\d+))(?:(?:,\s)|(?:")) 
+0

Génial! Merci beaucoup pour les réponses et les explications! –

0

Vous devrez saisir des virgules et des espaces aussi, car ils sont répétés dans votre chaîne:

\bid=\"(?<id>(ID-\d+-\d+,)+) 
0

Je crois que ce que vous essayez de faire est impossible avec regex pur, surtout si les ID et « N/a » peut être entremêlées. vous aurez besoin d'avoir une boucle dans votre programme, ou si vous utilisez Perl ou PHP, vous pouvez exécutez le code dans la partie de remplacement de l'expression régulière (commutateur /e) pour ajouter les correspondances à un tableau.