Регулярное выражение для списка с разделителями-запятыми


что такое регулярное выражение для проверки списка с разделителями-запятыми, как этот:

12365, 45236, 458, 1, 99996332, ......
10 55

10 ответов:

Я предлагаю вам сделать следующим образом:

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

который будет работать для списка, содержащего 1 или более элементов.

Это зависит немного от ваших точных требований. Я предполагаю: все числа, любой длины, числа не могут иметь ведущие нули и не содержат запятых или десятичных точек. отдельные числа всегда разделяются запятой, а затем пробелом, и последнее число не имеет запятую и пробел после него. Любая из этих ошибок упростит решение.

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

вот как я построил мысленно:

[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.

совпадение повторяющихся элементов с разделителями-запятыми:

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

ссылка.

это регулярное выражение можно использовать для разделения значений списка с разделителями-запятыми. Элементы списка могут быть заключены в кавычки, не заключены в кавычки или пусты. Запятые внутри пары кавычек не совпадают.

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

ссылка.

это регулярное выражение извлекает элемент из списка, разделенного запятыми, независимо от содержания:

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

Если вы просто замените запятую на что-то другое, это должно работать для любого разделителя.

/^\d+(?:, ?\d+)*$/

я использовал это для списка элементов, которые должны были быть буквенно-цифровыми без подчеркивания в передней части каждого элемента.

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

вы можете указать язык только для безопасности, но

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

должны работать

у меня было немного другое требование, чтобы разобрать закодированный словарь/хэш-таблицу с экранированными запятыми, например:

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

Я думаю, что это элегантное решение, с трюком, который позволяет избежать много сложности регулярных выражений:

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;
}

Я думаю, что он может быть адаптирован к исходному вопросу с выражением типа @"([0-9]+),\s?" и разобрать на Groups[0].

Я надеюсь, что это полезно для кого-то и спасибо за советы по получению его близко к там, особенно Асаф!

это будет отклонять посторонние запятые в начале или конце строки, если это важно для вас.

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

заменить possible|value|patterns с регулярным выражением, которое соответствует вашим допустимым значениям.

в JavaScript, используйте split чтобы помочь, и поймать любые отрицательные цифры, а также:

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