6
votes

Regex pour correspondre à la plage ou à la liste des nombres

J'ai besoin d'une regex pour faire correspondre des listes de chiffres et une autre pour correspondre à des plages de chiffres (expressions ne manqueront jamais dans les deux cas). Les gammes doivent être constituées d'un nombre, d'un tableau de bord et d'un autre nombre (N-N), tandis que des listes sont composées de chiffres séparés par une virgule (N, N, N). Vous trouverez ci-dessous quelques exemples.

gammes: strong> p> xxx pré>

list: strong> p>

'1,2,3' => OK
Whateverelse => NOK


4 commentaires

Est 1,2,4 ok? Avez-vous besoin que les chiffres soient en séquence?


Tout comme un conseil, vous pouvez utiliser ceci: Regexpal.com pour tester regex


Lorsque vous souhaitez des fonctionnalités avancées, cela dépend également de la saveur de l'OMS de Regex que vous utilisez. Perl a un ensemble de fonctionnalités. Awk un autre. Les programmes de style UNIX dépendent profondément du système d'exploitation utilisé.


Les expressions régulières sont destinées aux modèles de correspondance, ne vérifiant pas les valeurs numériques. Recherchez une chaîne probable avec la regex, puis vérifiez sa valeur numérique dans votre langue d'hôte (PHP, autre).


4 Réponses :


1
votes

Tout d'abord, vous devriez utiliser ancrages pour vous assurer que le match de regex englobe l'ensemble String et non seulement une sous-chaîne:

^([0-9]+,)+[0-9]+$


0 commentaires

5
votes

Essayez ceci: xxx

résultats de test: xxx

visualisation de la regex:

visualisation de la regex

edit: ajouté pour Wildcard * selon OP Commentaire.


3 commentaires

Cela fonctionne et est exactement ce que je recherche ... Je viens d'ajouter de la prise en charge des caractères génériques pour permettre aux expressions telles que "3- * 'ou" * -10': ^ (([\ * \ d] + - [\ * \ D] +) | ((\ d) (, \ d) +)) $; Le problème est que cette regex correspond également aux expressions telles que '* - *' (la génératrice peut être à droite ou à gauche, pas des deux côtés).


Je suppose que vous souhaitez également correspondre à 1- *, * -1 mais pas * - * ? Voir ma réponse mise à jour.


Simplement parfait! Merci beaucoup :-)



0
votes

La solution la plus simple à votre problème consiste à envelopper un ensemble supplémentaire de supports autour du second résultat:

((?:[0-9]+,?)+)


0 commentaires

2
votes

Celui-ci est un peu différent. C'est pour les ports sur un commutateur Procurve.
^ (((((\ d +) | (\ d + - \ d +)) ((((\ d +) | (\ d + - \ d +))) *) $
C'est à Perl. xxx

Je n'avais pas inclus le * ci-dessus. Et qu'avez-vous utilisé (@unlimit) pour ce schéma merveilleux?

-e


4 commentaires

Je pense que je pense déplacer (\ d + - \ d +) avant (\ d +) pour avoir un modèle correct avec votre résultat de test: ((((\ d + - \ d +) | (\ d +)) ((((((((((((\ d + - \ d + ) | (\ d +))) *)


Je viens de le tester (encore), et cela fonctionne comme il se doit. C'est-à-dire qu'il renvoie les résultats énumérés dans la réponse. Qu'est-ce qui bougerait l'expression autour du changement?


J'ai testé votre regex à Regexr.com et il ne correspond pas à tous les exemples de test.


Est-ce que ça marche avec Perl? Sauf si je faisais une coupe et une pâte-o, ce sont des résultats d'un test réel.