2010-06-25 4 views
1

J'essaie de faire une correspondance dans regex.Regroupement dans Regex

Il doit correspondre à une chaîne de caractères d'avec les formats suivants:

Démarrer avec un C ou H, w/6 caractères suivants. (Total 7 caractères) Commence par KK et avec 8 caractères suivants. (Au total 10 caractères)

Le champ est limité à 10 caractères dactylographiés. Je donne les résultats suivants:

(((C|H).{6})|(KK.{8}))

Il correspond à KK + 8 très bien. Il échoue sur C + 5 très bien. Il réussit très bien sur C + 6. Cependant, il réussit sur C + 7, C + 8 et C + 9.

Je suppose que mon regroupement est faux, quelqu'un peut-il signaler mon erreur?

C'est Regex aromatisé .NET et j'utilise Regex.IsMatch pour déterminer si le champ correspond exactement à mon regex.

Répondre

2

Vous devez anchor le début (^) et à la fin ($) de la chaîne:

^([CH].{6}|KK.{8})$ 

J'ai aussi parés les parenthèses inutiles et changé (C|H) à un character class pour améliorer la lisibilité.

+0

Intéressant, j'étais sous l'impression que IsMatch m'assurait que la chaîne entière correspondait, je suppose que je me trompais. Merci! –

+0

@Austitarum Custos: Vous avez peut-être pensé à la méthode nommée 'matches' de Java qui nécessite une correspondance exacte. –

+0

Aha oui vous avez raison, .NET a la même chose. Non utilisé pour valider les chaînes d'entrée, utilisé pour l'analyse. Explique ma confusion. –

1

Vous voulez capturer quelque chose du motif? Sinon, je voudrais essayer celui-ci:

^(KK..|C|H).{6}$ 
+0

+1 pour être fonctionnel et plus simple. Je crois que ce qui précède est la bonne façon pour mon approche, car ces formats de chaînes sont spécifiés par l'état et peuvent changer indépendamment l'un de l'autre. –

1

Vous devez ajouter le début et la fin de la ligne anchors:

^(((C|H).{6})|(KK.{8}))$ 
0

J'aime Mark Byers répondre au mieux, avec cette modification (testée. NET):

^[CH].{6}$|^KK.{8}$ 

L'original donnera une fausse correspondance pour les valeurs avec plus de 6 caractères après un C ou H.