Простая строка получения (игнорировать числа в конце) в С#

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

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


person Community    schedule 27.09.2009    source источник
comment
Я сопротивлялся изучению регулярных выражений в течение многих лет. Не будь мной.   -  person Robert Rossney    schedule 27.09.2009


Ответы (4)


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;
person Michael Stum    schedule 27.09.2009
comment
Не все регулярные выражения должны быть сложными. На самом деле, некоторые из более сложных иногда лучше заменить традиционной кодовой конструкцией. Знание лишь нескольких концепций (классы символов, поиск с возвратом, именованные группы) достаточно для эффективного решения многих повседневных проблем с обработкой строк — определенно стоит изучить основы! - person Michael Stum; 28.09.2009
comment
Решение RegEx не работает. Для ввода: asfsdf23424Aasdfsf222 будет выводиться asfsdf. Должно быть asfsdf23424Aasdfsf - person DarkPixel; 23.10.2013

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

string input = "ABCD1234";
string result = new string(input.TakeWhile(c => Char.IsLetter(c)).ToArray());
person Ahmad Mageed    schedule 27.09.2009
comment
Очень хороший ответ. Но не охватил все основы: он начинается с начала, считает действительными только буквенные символы и останавливается на первом недопустимом вхождении, которое может привести к сбою (в зависимости от ваших требований) для чего-то вроде input = "ABCD1234EFGH5678" - person Hamid Sadeghian; 10.01.2016

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

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);
person Guffa    schedule 27.09.2009
comment
Это ^ должно быть $ - иначе вы сопоставляете числа до начала строки;) - person Richard Szalay; 27.09.2009

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

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

person Nicholas Jordan    schedule 27.09.2009