web-dev-qa-db-fra.com

Liste regex pour liste délimitée par des virgules

Quelle est l'expression régulière pour valider une liste délimitée par des virgules comme celle-ci:

12365, 45236, 458, 1, 99996332, ......
63

Je vous suggère de faire de la manière suivante:

(\d+)(,\s*\d+)*

qui fonctionnerait pour une liste contenant un ou plusieurs éléments.

102
Asaph

Cette expression rationnelle extrait un élément d'une liste séparée par des virgules, quel que soit son contenu:

(.+?)(?:,|$)

Si vous remplacez simplement la virgule par quelque chose d'autre, cela devrait fonctionner pour n'importe quel délimiteur.

11
K. P.

Cela dépend un peu de vos besoins exacts. Je suppose: tous les nombres, toutes les longueurs, les nombres ne peuvent pas avoir de zéros ni des virgules ou des points décimaux. les numéros individuels toujours séparés par une virgule, puis un espace, et le dernier numéro n'a PAS de virgule et d'espace après. N'importe laquelle de ces erreurs simplifierait la solution.

([1-9] [0-9] *, []) * [1-9] [0-9] *

Voici comment j'ai construit ça mentalement:

[0-9]  any digit.
[1-9][0-9]*  leading non-zero digit followed by any number of digits
[1-9][0-9]*, as above, followed by a comma
[1-9][0-9]*[ ]  as above, followed by a space
([1-9][0-9]*[ ])*  as above, repeated 0 or more times
([1-9][0-9]*[ ])*[1-9][0-9]*  as above, with a final number that doesn't have a comma.
9
mcherm

Faites correspondre les éléments en double délimités par des virgules:

(?<=,|^)([^,]*)(,\1)+(?=,|$)

Référence .

Cette expression régulière peut être utilisée pour scinder les valeurs d'une liste délimitée par des virgules. Les éléments de la liste peuvent être entre guillemets, sans guillemets ou vides. Les virgules dans une paire de guillemets ne sont pas appariés.

,(?!(?<=(?:^|,)\s*"(?:[^"]|""|\\")*,)(?:[^"]|""|\\")*"\s*(?:,|$))

Référence .

7
madcolor
/^\d+(?:, ?\d+)*$/
5
w35l3y

Celui-ci rejettera les virgules superflues au début ou à la fin de la ligne, si cela est important pour vous.

((, )?(^)?(possible|value|patterns))*

Remplacer possible|value|patterns avec une expression régulière qui correspond à vos valeurs autorisées.

2
Will Hains

je l'ai utilisé pour une liste d'éléments qui doivent être alphanumériques sans traits de soulignement au début de chaque élément.

^(([0-9a-zA-Z][0-9a-zA-Z_]*)([,][0-9a-zA-Z][0-9a-zA-Z_]*)*)$
2
PPPaul

En JavaScript, utilisez split pour vous aider, et saisissez également les chiffres négatifs:

'-1,2,-3'.match(/(-?\d+)(,\s*-?\d+)*/)[0].split(',');
// ["-1", "2", "-3"]
// may need trimming if digits are space-separated
1
crazy4groovy

Ce qui suit correspond à toute combinaison mot/chiffre/espace délimitée par des virgules

(((.)*,)*)(.)*
1
Aidan

J'avais un besoin légèrement différent d'analyser un dictionnaire/hashtable codé avec des virgules, comme ceci:

"1=This is something, 2=This is something,,with an escaped comma, 3=This is something else"

Je pense que c'est une solution élégante, avec une astuce qui évite beaucoup de complexité regex:

if (string.IsNullOrEmpty(encodedValues))
{
    return null;
}
else
{
    var retVal = new Dictionary<int, string>();
    var reFields = new Regex(@"([0-9]+)\=(([A-Za-z0-9\s]|(,,))+),");
    foreach (Match match in reFields.Matches(encodedValues + ","))
    {
        var id = match.Groups[1].Value;
        var value = match.Groups[2].Value;
        retVal[int.Parse(id)] = value.Replace(",,", ",");
    }
    return retVal;
}

Je pense que cela peut être adapté à la question initiale avec une expression comme @"([0-9]+),\s?" et une analyse sur Groups[0].

J'espère que cela sera utile à quelqu'un et merci pour les astuces qui vous permettront de vous en approcher, en particulier Asaph!

1
alpsystems.com

Vous voudrez peut-être spécifier la langue juste pour être sûr, mais

(\d+, ?)+(\d+)?

devrait travailler

1
David Berger