2010-12-13 7 views
1

je besoin d'une expression régulière pour C# qui peut correspondre à motif suivantexpression régulière pour correspondre à un modèle

abc1abcd
1abcdefg
abcdefg1

essentiellement mon expression devrait avoir au moins un nombre et la taille minimale est de 8 char g nombre. Si possible, expliquez également la regex.

+0

Avez-vous eu un coup de poignard? – razlebe

+0

Je suggère qu'il est préférable de les trier et de comparer –

Répondre

2

Votre modèle d'expression régulière doit être juste: \d+ (match de 1 numéros ou plus). Pour exemple, il est probablement préférable de ne pas déterminer la longueur minimale à l'aide regex car tout ce que vous aimez est qu'il a au moins 1 nombre et est au moins de 8 caractères

Regex regEx = new Regex(@"\d+"); 
isValid = regEx.Match(myString).Success && myString.Length >= 8; 

Le motif \d est la même chose que [0-9] et le symbole + signifie at least one of. Le symbole @ en face de la chaîne est de sorte que ce que tenter d'échapper \d.

Comme mentionné par El Ronnoco dans les commentaires, juste \d correspondrait à votre exigence. Connaître \d+ est utile pour les modèles plus compliqués où vous voulez quelques chiffres entre certaines chaînes, etc.

Aussi: Je viens de lire quelque chose que je ne connaissais pas. \d correspond à n'importe quel caractère dans la catégorie Unicode number, decimal digit qui est beaucoup plus que juste [0-9]. Quelque chose à savoir si vous voulez juste un nombre. Sinon, la réponse de El Ronnoco de [0-9] pour votre modèle est suffisante.

+0

+1 Bonne explication. Bien que je pense que juste "\ d" 'suffira pour les exigences du PO? –

+0

Merci - J'ai mis à jour ma réponse et ajouté un peu que je n'ai pas réalisé sur '\ d' correspondant à tous les nombres Unicode –

3

Je vérifierais probablement avec deux instructions. Il suffit de vérifier la longueur par exemple

string.Length > 7 

puis assurez-vous qu'il ce regex peut trouver un match ...

[0-9] 
3

Vous pouvez utiliser un look-ahead assertion pour vérifier la longueur et la recherche puis en avant pour un chiffre, ainsi:

(?=.{8}).*[0-9] 

Nous préanalyse pour 8 caractères, et si cela réussit, nous essayons réellement correspondre à "n'importe quoi, suivi d'un chiffre".

Mais vraiment, ne faites pas cela. Vérifiez simplement la longueur explicitement. C'est beaucoup plus clair.

+0

+1 Pour l'idée alternative d'utiliser le look ahead (même si je suis d'accord pour vérifier explicitement la longueur est beaucoup plus clair). –

+0

+1 Clever. Je ne savais pas vraiment que tu pourrais utiliser un tel lookahead, mais je suppose que c'est logique. –

+0

Les regex sont censés être pour les penseurs latéraux, non? C'est pourquoi vous vous retrouvez avec deux problèmes lorsque vous pensez en utiliser un pour résoudre le premier problème. ;) –

Questions connexes