2009-12-14 12 views
2

J'ai une chaîne qui est pipe '|' délimité J'ai besoin d'une regex pour valider le nombre d'éléments, basé sur le caractère de pipe. Ainsi, une regex qui procédez comme suit:Regex pour valider le nombre d'éléments délimités par des tuyaux

Si le nombre maximum d'éléments est trois:

asdfasdf | asdfasdf | asdfasdf = VALIDE

asdfasdf | asdfasdf | asdfasdf | asdfasf = non valide

En outre, cette chaîne peut être vide.

Toute aide serait appréciée

Cordialement

+0

Dans quelle langue faites-vous affaire? – Zaid

Répondre

6
^(?:[^|]+(?:\|[^|]+){0,2})?$ 

Cela correspondra une chaîne vide ou jusqu'à trois tuyaux articles délimité, où un élément peut être un caractère autre qu'un tuyau . Chaque élément doit comporter au moins un caractère dans ce modèle; Si vous souhaitez autoriser les éléments vierges, remplacez les + s par * s.

Si vous souhaitez modifier la limite supérieure du nombre d'articles sont autorisés, changer {0,2} à {0,max-1}, où max est la limite que vous voulez (parce que vous avez au plus max - 1 tuyaux dans votre chaîne pour qu'elle soit valide).

+0

Juste curieux, mais le regroupement n'est-il pas inutile? IE: ne pourriez-vous pas supprimer le groupement et le rendre aussi efficace/correct? Il se peut que je manque quelque chose ... – Randyaa

+0

'(?: ...)' définit un groupe qui ne capture pas (c'est-à-dire qu'il ne crée pas de référence arrière). Les deux groupes sont nécessaires - le groupe externe permet que le motif entier soit rendu optionnel par le '?' Pour permettre une chaîne vide; l'intérieur regroupe le tuyau avec l'élément suivant. –

+0

Même si je sais que la question d'origine nécessitait l'utilisation d'expressions régulières, c'est trop pour un problème aussi simple.Je pense que la meilleure solution est simplement de parcourir tous les personnages et de compter les tuyaux. –

3

Utilisez-vous un langage de programmation? Si oui, il a probablement des fonctions spécifiques pour cela. Utiliser regex pour tout ce qui est lié à la chaîne est mauvais si cela peut être évité.

PHP:

$items = explode('|', $mystr); 
if ($items > $max) failed 

Python:

items = mystr.split('|') 
if len(items) > max: failed 
0

Il est probablement plus facile de compter ici les caractères |. Par exemple. dans PowerShell:

PS> $valid = 'asdfasdf|asdfasdf|asdfasdf' 
PS> $notvalid= 'asdfasdf|asdfasdf|asdfasdf|asdfasf' 
PS> ($valid.ToCharArray() | where {$_ -eq '|' }).Count -lt 3 
True 
PS> ($notvalid.ToCharArray() | where {$_ -eq '|' }).Count -lt 3 
False 
0
^[^|]*(?:\|[^|]*){0,2}$ 

Cela suppose que les articles entre les tuyaux peuvent être vides.

0
^([^|]*\|){0,2}[^|]*$ 

permet aux éléments de chaîne vide, jusqu'à trois éléments, changer le 0 ou 2 pour modifier le min/max gamme.

1

Pourquoi utiliser une expression régulière? Juste itérer sur la chaîne et compter chaque tuyau. C'est effectivement faire ce que regex fait, mais sans avoir à garder tous les bookings correspondant à un pattern.

Questions connexes