Разбор строк, извлечение цифр и букв - PullRequest
5 голосов
/ 09 апреля 2009

Какой самый простой способ разобрать строку и извлечь число и букву? У меня есть строка, которая может быть в следующем формате (число | буква или буква | число), т.е. «10A», «B5», «C10», «1G» и т. Д.

Мне нужно извлечь две части, то есть "10A" -> "10" и "A".

Обновление: Спасибо всем за отличные ответы

Ответы [ 6 ]

12 голосов
/ 09 апреля 2009

Самый простой способ - использовать регулярные выражения.

((?<number>\d+)(?<letter>[a-zA-Z])|(?<letter>[a-zA-Z])(?<number>\d+))

Затем вы можете сопоставить его со строкой и извлечь значение из групп.

Match match = regex.Match("10A");
string letter = match.Groups["letter"].Value;
int number = int.Parse(match.Groups["number"].Value);
6 голосов
/ 09 апреля 2009

Самый простой и быстрый способ - использовать простые строковые операции. Используйте метод IsDigit, чтобы проверить, где находится буква, и проанализируйте остаток строки до числа:

char letter = str[0];
int index = 1;
if (Char.IsDigit(letter)) {
   letter = str[str.Length - 1];
   index = 0;
}
int number = int.Parse(str.Substring(index, str.Length - 1));
4 голосов
/ 09 апреля 2009
char letter = str.Single(c => char.IsLetter(c));
int num = int.Parse(new string(str.Where(c => char.IsDigit(c)).ToArray()));

Это решение не очень строго (оно допускает такие вещи, как "5A2" и возвращает "A" и 52), но оно может подойти для ваших целей.

3 голосов
/ 09 апреля 2009

Просто чтобы быть другим:

string number = input.Trim("ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray());
string letter = input.Trim("0123456789".ToCharArray());
1 голос
/ 09 апреля 2009

Вот как я бы подошел к этому. Вы можете пройти через это и поместить gc1 ["letter"], gc1 ["number"], gc2 ["letter"] и gc2 ["number"] в окно просмотра, чтобы увидеть, что это сработало (шаг после последнего строка кода здесь, конечно).

Обычное выражение будет принимать либо шаблон, требующий одну или несколько букв и цифр в каждом случае.

        Regex pattern = new Regex("^(?<letter>[a-zA-Z]+)(?<number>[0-9]+)|(?<number>[0-9]+)(?<letter>[a-zA-Z]+)$");
        string s1 = "12A";
        string s2 = "B45";
        Match m1 = pattern.Match(s1);
        Match m2 = pattern.Match(s2);
        GroupCollection gc1 = m1.Groups;
        GroupCollection gc2 = m2.Groups;
0 голосов
/ 23 ноября 2012

Использование Sprache и немного Linq кунг-фу:

var tagParser =
    from a in Parse.Number.Or(Parse.Letter.Once().Text())
    from b in Parse.Letter.Once().Text().Or(Parse.Number)
    select char.IsDigit(a[0]) ?
           new{Number=a, Letter=b} : new{Number=b, Letter=a};

var tag1 = tagParser.Parse("10A");
var tag2 = tagParser.Parse("A10");

tag1.Letter; // should be A 
tag1.Number; // should be 10

tag2.Letter; // should be A
tag2.Number; // should be 10

/* Output:
   A
   10
   A
   10
 */
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...