2012-03-19 22 views
10

Jeśli mam ciąg danych z liczbami w nim. Ten wzór nie jest spójny. Chciałbym wyodrębnić wszystkie liczby z łańcucha i tylko znak, który jest zdefiniowany jako dozwolone. Myślałem, że RegEx może być najłatwiejszym sposobem na zrobienie tego. Można udostępnić tupot regex, że może to zrobić jak myślę regex jest voodoo i tylko regex szamani wiedzą jak to działaRegEx dla zastąpienia wszystkich znaków oprócz cyfr

np/

"Q1W2EE3R45T" = "12345" 
"WWED456J" = "456" 
"ABC123" = "123" 
"N123" = "N123" //N is an allowed character 

UPDATE: Oto mój kod:

var data = Value.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); 
data = data.Select(x => Regex.Replace(x, "??????", String.Empty)).ToArray(); 
+0

są struny bardzo długo ?? a for nie jest opcją ??? – gbianchi

+0

Dół głosowania dlaczego ?? – Jon

+0

'" regex jest voodoo i tylko ludzie medycyny regex wiedzą jak to działa "'. Nie prawda! Ma to sens, gdy się nad tym zastanowić, kawałek po kawałku. – katrielalex

Odpowiedz

12
String numbersOnly = Regex.Replace(str, @"[^\d]", String.Empty); 

Korzystanie Regex.Replace(string,string,string) metody statycznej.

Sample

Aby umożliwić N można zmienić wzór do [^\dN]. Jeśli szukasz n jak dobrze można albo zastosować RegexOptions.IgnoreCase lub zmienić klasę [^\dnN]

+0

Ups! Właśnie zdałem sobie sprawę, że muszę dopuścić znak "N". – Jon

+1

Myślę, że jego [^ \ dN] – Jon

+0

@Jon: Zaktualizowałem moją odpowiedź, aby zezwolić na 'N'. –

3

ma potrzeby korzystania z regexes! Wystarczy przejrzeć postacie i zapytać każdego z nich, czy są cyframi.

s.Where(Char.IsDigit) 

Lub jeśli jest to potrzebne jako ciąg

new String(s.Where(Char.IsDigit).ToArray()) 

EDIT Widocznie trzeba także 'N':

new String(s.Where(c => Char.IsDigit(c) || c == 'N').ToArray()) 

edytuj Przykład:

var data = Value.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); 
data = data.Select(s => 
    new String(s.Where(c => Char.IsDigit || c == 'N').ToArray()) 
).ToArray(); 

To trochę przerażające - zagnieżdżone lambdas - więc lepiej byłoby użyć wyrażenia regularnego dla jasności.

+0

Czy możesz użyć mojego LINQ do pokazania odpowiedzi, ponieważ IsDigit sprawdza tylko znak w ciągu znaków? – Jon

+0

@Jak co? Nie rozumiem twojego zdania. – katrielalex

+0

Czy możesz użyć kodu w moim pytaniu, aby pokazać, jak twoja odpowiedź zmieściłaby się w nim? – Jon

1

Jak o czymś wzdłuż linii

String s = ""; 
for (int i = 0; i < myString.length;){ 
    if (Char.IsDigit(myString, i)){ s += myString.Chars[i]; } 
} 
+0

Użytkownik edytował wpis .. Potrzebuje N również ... – gbianchi

Powiązane problemy