Как извлечь подстроку из строки, пока не встретится второй пробел? - PullRequest
24 голосов
/ 08 апреля 2010

У меня есть такая строка:

"o1 1232.5467 1232.5467 1232.5467 1232.5467 1232.5467 1232.5467"

Как мне извлечь только "o1 1232.5467"?

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

Ответы [ 13 ]

51 голосов
/ 08 апреля 2010

Простой подход был бы следующим:

string[] tokens = str.Split(' ');
string retVal = tokens[0] + " " + tokens[1];
19 голосов
/ 08 апреля 2010

Просто используйте String.IndexOf дважды, как в:

     string str = "My Test String";
     int index = str.IndexOf(' ');
     index = str.IndexOf(' ', index + 1);
     string result = str.Substring(0, index);
9 голосов
/ 08 апреля 2010

Получить позицию первого пробела:

int space1 = theString.IndexOf(' ');

Положение следующего пробела после этого:

int space2 = theString.IndexOf(' ', space1 + 1);

Получить часть строки до второго пробела:

string firstPart = theString.Substring(0, space2);

Приведенный выше код помещает togehter в одну строку:

string firstPart = theString.Substring(0, theString.IndexOf(' ', theString.IndexOf(' ') + 1));
5 голосов
/ 08 апреля 2010
s.Substring(0, s.IndexOf(" ", s.IndexOf(" ") + 1))
3 голосов
/ 08 апреля 2010

Примерно так:

int i = str.IndexOf(' ');
i = str.IndexOf(' ', i + 1);
return str.Substring(i);
3 голосов
/ 08 апреля 2010

Используйте регулярное выражение:.

Match m = Regex.Match(text, @"(.+? .+?) ");
if (m.Success) {
    do_something_with(m.Groups[1].Value);
}
1 голос
/ 08 апреля 2010

: P

Просто обратите внимание, я думаю, что большинство алгоритмов здесь не проверят, если у вас есть 2 или более пробелов вместе, поэтому он может получить пробел в качестве второго слова.

Я не знаю, будет ли это лучшим способом, но я немного повеселился с ним: P (хорошо, что он позволяет выбрать количество пробелов / слов, которые вы хотите взять)

        var text = "a sdasdf ad  a";
        int numSpaces = 2;
        var result = text.TakeWhile(c =>
            {
                if (c==' ')
                    numSpaces--;

                if (numSpaces <= 0)
                    return false;

                return true;
            });
        text = new string(result.ToArray());

Я также получил ответ @ ho и превратил его в цикл, чтобы вы могли снова использовать его для любого количества слов: P

        string str = "My Test String hello world";
        int numberOfSpaces = 3;
        int index = str.IndexOf(' ');     

        while (--numberOfSpaces>0)
        {
            index = str.IndexOf(' ', index + 1);
        }

        string result = str.Substring(0, index);
1 голос
/ 08 апреля 2010
string testString = "o1 1232.5467 1232.5467.........";

string secondItem = testString.Split(new char[]{' '}, 3)[1];
1 голос
/ 08 апреля 2010
 string[] parts = myString.Split(" ");
 string whatIWant = parts[0] + " "+ parts[1];
0 голосов
/ 21 октября 2010

Я думал об этой проблеме для своего собственного кода, и, хотя я, вероятно, в итоге буду использовать что-то более простое / более быстрое, вот еще одно решение Linq, похожее на то, которое добавило @Francisco.

Мне просто нравится этопотому что он читается так, как вы хотите: «Возьмите символы, в то время как полученная подстрока содержит менее 2 пробелов».

string input = "o1 1232.5467 1232.5467 1232.5467 1232.5467 1232.5467 1232.5467";
var substring = input.TakeWhile((c0, index) => 
                                input.Substring(0, index + 1).Count(c => c == ' ') < 2);
string result = new String(substring.ToArray());
...