Регулярное выражение для списка с разделителями-запятыми
что такое регулярное выражение для проверки списка с разделителями-запятыми, как этот:
12365, 45236, 458, 1, 99996332, ......
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*(?:,|$))
это регулярное выражение извлекает элемент из списка, разделенного запятыми, независимо от содержания:
(.+?)(?:,|$)
Если вы просто замените запятую на что-то другое, это должно работать для любого разделителя.
я использовал это для списка элементов, которые должны были быть буквенно-цифровыми без подчеркивания в передней части каждого элемента.
^(([0-9a-zA-Z][0-9a-zA-Z_]*)([,][0-9a-zA-Z][0-9a-zA-Z_]*)*)$
у меня было немного другое требование, чтобы разобрать закодированный словарь/хэш-таблицу с экранированными запятыми, например:
"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]
.Я надеюсь, что это полезно для кого-то и спасибо за советы по получению его близко к там, особенно Асаф!