Что такое регулярное выражение для проверки списка с разделителями-запятыми, как этот:
12365, 45236, 458, 1, 99996332, ......
Что такое регулярное выражение для проверки списка с разделителями-запятыми, как этот:
12365, 45236, 458, 1, 99996332, ......
Я предлагаю вам сделать следующее:
(\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.
Совместить дубликаты разделенных запятыми элементов:
(?<=,|^)([^,]*)(,\1)+(?=,|$)
Это регулярное выражение может использоваться для разделения значений списка с разделителями-запятыми. Элементы списка могут быть указаны, некорректно или пустыми. Запятые внутри пары кавычек не совпадают.
,(?!(?<=(?:^|,)\s*"(?:[^"]|""|\\")*,)(?:[^"]|""|\\")*"\s*(?:,|$))
/^\d+(?:, ?\d+)*$/
Я использовал это для списка элементов, которые должны были быть буквенно-цифровыми без подчеркивания в начале каждого элемента.
^(([0-9a-zA-Z][0-9a-zA-Z_]*)([,][0-9a-zA-Z][0-9a-zA-Z_]*)*)$
Этот будет отклонять посторонние запятые в начале или конце строки, если это важно для вас.
((, )?(^)?(possible|value|patterns))*
Замените possible|value|patterns
регулярным выражением, которое соответствует вашим допустимым значениям.
Возможно, вы захотите указать язык, чтобы быть в безопасности, но
(\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]
.
Я надеюсь, что это поможет кому-то и спасибо за советы по его приближению, особенно Асаф!
В JavaScript используйте split
, чтобы помочь и поймать любые отрицательные цифры:
'-1,2,-3'.match(/(-?\d+)(,\s*-?\d+)*/)[0].split(',');
// ["-1", "2", "-3"]
// may need trimming if digits are space-separated
Следующее будет соответствовать любой комбинации слов/цифр/пробелов, разделенных запятыми
(((.)*,)*)(.)*