Що таке регулярний вираз для перевірки списку, розділеного комами, подібного до цього:
12365, 45236, 458, 1, 99996332, ......
Що таке регулярний вираз для перевірки списку, розділеного комами, подібного до цього:
12365, 45236, 458, 1, 99996332, ......
Відповіді:
Я пропоную вам зробити наступним чином:
(\d+)(,\s*\d+)*
який би працював для списку, що містить 1 або більше елементів.
(^$)|(^(\d+)(,\s*\d+)*$)
може працювати, хоча.
"1"
або "12345"
. Цей список не містить декількох елементів, тому в них немає коми. І ваш регулярний вираз (\d+,)*
вимагає, щоб після кожного числа ставилася кома.
Цей регулярний вираз витягує елемент зі списку, розділеного комами, незалежно від вмісту:
(.+?)(?:,|$)
Якщо ви просто заміните кому комусь іншим, він повинен працювати для будь-якого роздільника.
(.+?)(?:,\s*|$)
/expr/g
), але, мабуть, це не все так стандартно. Наприклад, у PHP вам потрібно використовувати preg_match_all()
замість preg_match()
. Інші смаки регулярного виразу мають інші способи зробити це.
Це трохи залежить від ваших точних вимог. Я припускаю: всі числа, будь-яка довжина, числа не можуть мати початкових нулів, а також не містити коми або десяткові крапки. окремі числа, завжди розділені комою, а потім пробілом, а останнє число НЕ має коми і пробілу після нього. Будь-яка з цих помилок спрощує рішення.
([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-9][0-9]*[ ]*,[ ]*)*[1-9][0-9]*
... можливо, комусь це буде корисно
Збіг повторюваних елементів, розділених комами:
(?<=,|^)([^,]*)(,\1)+(?=,|$)
Цей регулярний вираз можна використовувати для розділення значень списку, розділеного комами. Елементи списку можуть бути в лапках, без лапок або порожніми. Коми всередині пари лапок не збігаються.
,(?!(?<=(?:^|,)\s*"(?:[^"]|""|\\")*,)(?:[^"]|""|\\")*"\s*(?:,|$))
(foo|bar)
відповідає foo
або bar
. Для отримання додаткової інформації: regular-expressions.info/alternation.html
Він відхилить сторонні коми у початку або в кінці рядка, якщо це для вас важливо.
((, )?(^)?(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
Далі буде відповідати будь-якій комбінації слів, цифр / пробілів, розділених комами
(((.)*,)*)(.)*
12365,45236,"This is a \"test."