5 votes

Regex pour faire correspondre un trait d'union dans une chaîne 0 ou 1 fois

J'essaie de créer une expression rationnelle qui vérifie si une chaîne de caractères contient un trait d'union 0 ou 1 fois.

Il retournerait donc les chaînes suivantes comme étant correctes.

1-5
1,3-5
1,3

Ce qui suit est faux.

1-3-5

J'ai essayé ce qui suit, mais cela fonctionne bien avec 1-3-5 :

([^-]?-){0,1}[^-]

12voto

FishBasketGordo Points 14957

Ça marche :

^[^-]*-?[^-]*$
^^    ^ ^    ^
||    | |    |
||    | |    |-- Match the end of string
||    | |------- Match zero or more non-hyphen characters
||    |--------- Match zero or one hyphens
||-------------- Match zero or more non-hyphen characters
|--------------- Match the beginning of string

Dans ce cas, vous devez spécifier la correspondance avec le début ( ^ ) et la fin ( $ ) des chaînes d'entrée, afin d'éviter d'obtenir des correspondances multiples pour une chaîne telle que 1-3-5 .

5voto

user7116 Points 39829

Peut-être quelque chose de plus simple :

var hyphens = input.Count(cc => cc == '-');

Votre expression régulière fonctionne car elle a trouvé la première occurrence d'un trait d'union, qui répond à vos critères. Vous pourriez utiliser l'expression régulière suivante, mais ce ne serait pas idéal :

^[^-]*-?[^-]*$

2voto

keyboardP Points 44625

Si vous avez vos chaînes de caractères dans une collection, vous pouvez le faire en une seule ligne de LINQ. Vous obtiendrez une liste de chaînes de caractères contenant moins de deux traits d'union.

var okStrings = allStrings.Where(s => s.Count(h => h == '-') < 2).ToList();

À en juger par la façon dont vous avez formaté la liste de chaînes, je suppose que vous ne pouvez pas faire de séparation sur la virgule, car ce n'est pas un délimiteur cohérent. Si c'est le cas, vous pouvez simplement utiliser la fonction String.Split pour récupérer chaque chaîne et remplacer le allStrings ci-dessus avec ce tableau.

0voto

Jonesy Points 5487

Vous pourriez l'aborder de cette façon :

string StringToSearch = "1-3-5";
MatchCollection matches = Regex.Matches("-", StringToSearch);
if(matches.Count == 0 || matches.Count == 1)
{
  //...
}

-2voto

Frank Sposaro Points 4863

Je viens de tester votre expression et elle semble donner le résultat que vous souhaitez. Elle décompose 1-3-5 en {1-3} et {-5}.

http://regexpal.com/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X