2009-09-27 4 views
4

Я считаю, что регулярное выражение слишком велико, и мне требуется некоторое время для написания кода (я думаю, теперь я должен узнать, что знаю некоторое регулярное выражение).Простой get string (игнорировать числа в конце) в C#

Самый простой способ отделить строку в алфавитно-цифровой строке? Это всегда будет LLLLDDDDD. Мне нужны только буквы (l), обычно это только 1 или 2 буквы.

+2

Я много лет сопротивлялся обучению регулярным выражениям. Не будь я. –

ответ

11

TrimEnd:

string result = input.TrimEnd(new char[]{'0','1','2','3','4','5','6','7','8','9'}); 
// I'm sure using LINQ and Range can simplify that. 
// also note that a string like "abc123def456" would result in "abc123def" 

Но RegEx также прост:

string result = Regex.Match(input,@"^[^\d]+").Value; 
+0

wow я понятия не имел, у вас может быть одно liner regex. – 2009-09-27 19:16:33

+1

Не все Regexes должны быть сложными. На самом деле некоторые из более сложных могут иногда лучше заменяться традиционной конструкцией кода. Знание только нескольких концепций (классы символов, обратная связь, именованные группы) достаточно эффективно, чтобы эффективно решать многие повседневные проблемы с обработкой строк - определенно стоит изучить основы! –

+3

Решение RegEx не работает. Для ввода: asfsdf23424Aasdfsf222 он выведет asfsdf. Это может быть asfsdf23424Aasdfsf – DarkPixel

10

Я предпочитаю регулярок ответ Майкла Штума, но вот подход LINQ, а также:

string input = "ABCD1234"; 
string result = new string(input.TakeWhile(c => Char.IsLetter(c)).ToArray()); 
+0

+1 Здесь нет волшебства, это понятно. –

+0

Очень хороший ответ. Но он не охватывал все базы: он начинается с самого начала, только считается, что символы букв действительны и останавливается при ** первом ** недопустимом вхождении, которое потерпит неудачу (в зависимости от ваших требований) для чего-то типа «input =» ABCD1234EFGH5678 " ' –

3

Вы может использовать регулярное выражение, которое соответствует цифрам для их удаления:

input = Regex.Replace(input, "\d+$", String.Empty); 

Старомодный петля не плох, он должен быть на самом деле самым быстрым решением:

int len = input.Length; 
while (input[len-1] >= '0' && input[len-1] <= '9') len--; 
input = input.Substring(0, len); 
+1

Это^должно быть $ - в противном случае вы сопоставляете числа перед началом строки;) –

+0

@Richard: Да, вы абсолютно правы. :) – Guffa

0

Они получили это - обратите внимание на хорошие решения используют не оператору использовать ваше описание проблемы : «Не числа», если у вас были цифры на фронте, кажется, из-за моих ограниченных выигрышей, что у вас должно быть то, что называется захватом групп, чтобы пройти мимо того, что находится на переднем конце строки. Парадигма дизайна, которую я использую сейчас, не является символом разделителя, за которым следует символ разделителя, а затем открывающая фигурная скобка.

Это приводит к необходимости использования символа разделителя, который не находится в результирующем наборе, который для одной вещи может быть хорошо установленными значениями ascii для разделителей данных, например 0x0019/0x0018 и т. Д.