L'expression rationnelle correspondant key=“valeur” modèle
Je veux correspondre le motif suivant:
key="value" key="value" key="value" key="value" ...
où la clé et la valeur sont [a-z0-9]+, les deux devraient être regroupées (2 groupes, les " - caractères peut être associé ou sauté)
d'entrée qui ne doit pas correspondre à:
key="valeur"key="valeur" (pas d'espace entre les paires)
Pour l'instant j'ai eu(pas .NET syntaxe):
([a-z0-9]+)=(\"[a-z0-9]+\")(?=\s|$)
le problème avec ça, qu'elle correspond à key4="value4" en entrée:
key3="value3"key4="value4"
- pourquoi avez-vous besoin de regex ici? vous pouvez simplement diviser l'espace et d'obtenir vos paires
- Je suis d'accord. Ne pas utiliser les expressions régulières, sauf si vous en avez besoin pour les non trivial modèles. C'est tout simplement la division de l'espace.
- pouvez-vous donner un exemple de ce que tu veux dire?
- Êtes-vous essayer d'analyser les attributs XML avec la Regex? Sûrement faisable, mais dans ce cas, il est plus facile à utiliser intégré d'analyse XML en C#, par exemple, mais pas exclusivement, LINQ to XML.
- Résidus formés, ce n'est pas des attributs XML. C'est quelque chose d'autre, privé de la syntaxe.
Vous devez vous connecter pour publier un commentaire.
La spec n'est pas très clair, mais vous pouvez essayer:
Ou, comme C# chaîne de caractères littérale:
Il utilise un négatif lookarounds pour s'assurer que la paire clé-valeur n'est ni précédée ni suivie par des non-caractères espace.
Voici un exemple extrait de (comme on le voit sur ideone.com):
Questions connexes
(?<=#)[^#]+(?=#)
travail?Sur la validation de l'ensemble de l'entrée
Vous pouvez utiliser
Regex.IsMatch
pour voir si la chaîne d'entrée correspond à l'encontre de ce que devrait être le bon modèle d'entrée. Vous pouvez également utiliser le même modèle pour extraire les clés/valeurs, grâce au fait que .NET regex permet d'accéder à un individu de capture.Ci-dessus imprime (comme on le voit sur ideone.com):
Références
Explication du motif
Le motif pour valider l'ensemble de l'entrée est essentiellement:
Où chaque entrée est:
Qui est une paire clé/valeur suivie par un espace ou la fin de la chaîne.
Je pense que SilentGhost proposition sur l'utilisation de la Chaîne.Split()
Comme ceci :
C'est définitivement plus rapide et plus simple.
Utiliser un lookbehind comme vous avez utilisé votre anticipation:
J'deuxième Jens réponse (mais je suis encore trop chétif pour commenter les réponses des autres).
Aussi, j'ai trouvé cette Expressions Régulières de Référence site pour être tout à fait impressionnant. Il y a une section sur Lookaround environ à mi-chemin vers le bas sur le Avancé page, et quelques notes à propos de Lookbehind.