2009-09-08 17 views
52

Co to jest wyrażenie regularne do sprawdzania poprawności rozdzielany przecinkami listę jak ten:Regex dla rozdzielany przecinkami listę

12365, 45236, 458, 1, 99996332, ...... 
+0

Czy będzie kiedykolwiek uciekły znaków, takich jak: '12365,45236 "To jest \" test„. ' – ceejayoz

+6

Dlaczego musi to być wyrażenie regularne? W zależności od języka może być lepiej za pomocą wbudowanego analizatora składni CSV –

Odpowiedz

86

Proponuję zrobić w następujący sposób:

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

która będzie działać na liście zawierającej 1 lub więcej elementów.

+1

masz rację, musiałem usunąć pierwszą postać, zanim mogłem skorzystać z regex, dziękuję wszystkim za pomoc – everLearningStudent

+0

to wydaje się działać tylko do pierwszego przecinka ... – ondrobaco

+0

@ondrobaco: Prawdopodobnie tylko kontroluje pierwsza grupa dopasowania. Następna grupa dopasowania będzie zawierała resztę listy. – Asaph

6

Mecz duplikatów rozdzielany przecinkami:

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

Reference.

To wyrażenie może służyć do dzielenia wartości listy rozdzielanej przecinkami. Elementy listy mogą być cytowane, niecytowane lub puste. Przecinki wewnątrz pary cudzysłowów nie są dopasowane.

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

Reference.

+0

Co dokładnie oznacza symbol potoku (|)? Jest to jeden z symboli nieobjaśnionych w strona, do której prowadzi link, i nie mogę tego zrozumieć –

+0

@ThomasVanderStichele: Jest na przemian. '(foo | bar)' pasuje do 'foo' lub' bar'. Więcej informacji: http: // www. regularne-expressions.info/alternation.html –

1

Możesz też określić język, dla pewności, ale

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

powinien pracować

+1

To rozwiązanie kończy się niepowodzeniem dla listy zawierającej tylko 1 element. Zobacz moje rozwiązanie poniżej. – Asaph

6

To zależy trochę na swoich konkretnych wymagań. Zakładam: wszystkie liczby, dowolna długość, liczby nie mogą mieć początkowych zera ani zawierać przecinków ani kropek dziesiętnych. poszczególne liczby zawsze oddzielone przecinkiem od spacji, a ostatnia liczba NIE zawiera przecinka i spacji. Każde z tych błędów byłoby uproszczenie rozwiązania.

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

Oto jak zbudowałem że psychicznie:

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

dziękuję za szybki samouczek. – everLearningStudent

+0

Znalazłem tę odpowiedź naprawdę użyteczną, po prostu potrzebowałem drobnej korekty, aby zaakceptować spacje przed i po przecinku '([1-9] [0-9] * [] *, [] *) * [1-9] [0-9] * '... może ktoś uzna to za przydatne – pollirrata

+0

Najbardziej podoba mi się ten przykład, w jaki sposób mogę zezwolić na łamanie linii? – justinpees

2

Użyłem tego dla listy przedmiotów, które musiały być alfanumeryczne bez podkreśleń na początku każdej pozycji.

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

miałem nieco inny wymóg, aby zanalizować zakodowany słownik/hashtable ze zbiegłych przecinkami, na przykład:

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

Myślę, że to eleganckie rozwiązanie, z trick, który pozwala uniknąć wielu z regex złożoności:

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

Myślę, że może być dostosowany do pierwotnego pytania z wyrazem jak @"([0-9]+),\s?" i analizować na Groups[0].

Mam nadzieję, że komuś to pomoże, a dzięki za wskazówki, jak to zrobić, zwłaszcza Asaph!

1

Ten odrzuci obce przecinki na początku lub na końcu linii, jeśli jest to dla ciebie ważne.

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

Wymień possible|value|patterns z regex pasującej do dozwolonych wartości.

5

Ten regex wydobywa element z listy oddzielone przecinkami, niezależnie od zawartości:

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

Jeśli po prostu zastąpić przecinek z czegoś innego, to powinno działać na każdym ogranicznik.

+0

Czy wyodrębnia więcej niż jeden element? – paranza

+0

Dzięki bardzo przydatne! – mt81

+0

To jest świetne! Dzięki! – dabito

0

W JavaScript, użyj split pomóc i złapać żadnych negatywnych cyfry, a także:

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