2010-01-27 7 views
3

Disons que j'ai une collection de chaînes "123AB", "456CDEF", "789G", "012-HI". Comment puis-je trouver toutes les chaînes qui sont numéro (1 ou plus) suivi par alpha (1 ou plus) sans caractères spéciaux, où les caractères alpha ne sont pas AB? Pour clarifier, l'expression rationnelle appliquée à la collection précédente devrait produire "456CDEF" et "789G". "123AB" est ignoré car la valeur alpha est AB et "012-HI" est ignoré car il contient un non-alpha. La regex pour ce que je cherche, moins la règle spéciale AB, est ^[0-9]+[A-Z]+$. Le cas est irrelevent. J'ai essayé quelques variantes de la règle [^ ] sans succès, puisque tous les motifs que j'ai trouvés permettent des caractères spéciaux.Regex - Correspond aux caractères alpha qui ne correspondent pas à un sous-ensemble de caractères alpha (C#)

Pour généraliser, comment puis-je faire correspondre un ensemble de valeurs alpha qui ne correspondent pas à un certain sous-ensemble de valeurs alpha, en utilisant un seul motif regex?

Note: "123ABC" doit également être accepté. Seules les chaînes avec AB doivent être ignorées.

Répondre

2

Vous voulez une assertion avant: ^[0-9]+(?!AB$)[A-Z]+$

+0

Courte, douce et facilement évolutive lorsque AB devient AB, CD et EF! – thorncp

0

Sans préanalyse:

^[0-9] + ([BZ] | A [AC-Z]) [AZ] * $

Edit:
Retirées, parce que cela ne correspond pas à quelque chose comme 123A. Mais je vais laisser la réponse visible comme un exemple de ce qui ne fonctionnera pas.

0

^\d+(?:a(?:b[a-z]+|[^b][a-z]*)?|[^a][a-z]*)$
début de chaîne, puis une ou plusieurs chiffres, puis soit (A) un suivi de b suivie par d'autres lettres, ou (B) un suivi par une lettre autre que b et éventuellement toute lettre après cela, ou (C) une lettre autre que a suivie d'une lettre, puis une fin de chaîne

Questions connexes