web-dev-qa-db-fra.com

Comment extraire une sous-chaîne d'une chaîne jusqu'à rencontrer le deuxième espace?

J'ai une chaîne comme celle-ci:

"o1 1232.5467 1232.5467 1232.5467 1232.5467 1232.5467 1232.5467"

Comment extraire uniquement "o1 1232.5467"?

Le nombre de caractères à extraire n'est pas toujours le même. Par conséquent, je veux seulement extraire jusqu'à ce que le deuxième espace soit rencontré.

22
gbprithvi

Une approche simple serait la suivante:

string[] tokens = str.Split(' ');
string retVal = tokens[0] + " " + tokens[1];
48
Sorantis

Utilisez juste String.IndexOf deux fois comme dans:

     string str = "My Test String";
     int index = str.IndexOf(' ');
     index = str.IndexOf(' ', index + 1);
     string result = str.Substring(0, index);
19
Hans Olsson

Obtenir la position du premier espace:

int space1 = theString.IndexOf(' ');

La position de la prochaine case après ça:

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

Obtenez la partie de la chaîne jusqu'au deuxième espace:

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

Le code ci-dessus est mis dans une seule ligne:

string firstPart = theString.Substring(0, theString.IndexOf(' ', theString.IndexOf(' ') + 1));
9
Guffa
s.Substring(0, s.IndexOf(" ", s.IndexOf(" ") + 1))
5
RedFilter

Utilisez une regex:.

Match m = Regex.Match(text, @"(.+? .+?) ");
if (m.Success) {
    do_something_with(m.Groups[1].Value);
}
3
Marcelo Cantos

Quelque chose comme ça:

int i = str.IndexOf(' ');
i = str.IndexOf(' ', i + 1);
return str.Substring(i);
3
den123
 string[] parts = myString.Split(" ");
 string whatIWant = parts[0] + " "+ parts[1];
1
Henk Holterman
string testString = "o1 1232.5467 1232.5467.........";

string secondItem = testString.Split(new char[]{' '}, 3)[1];
1
Asad Butt

: P 

Juste une note, je pense que la plupart des algorithmes ici ne vérifieront pas si vous avez 2 espaces ou plus ensemble, de sorte qu'il pourrait obtenir un espace comme second mot.

Je ne sais pas si c'est le meilleur moyen, mais je me suis amusé un peu en le lançant: P (le point positif est que cela vous permet de choisir le nombre d'espaces/mots que vous voulez utiliser)

        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());

J'ai aussi eu la réponse de @ ho et en ai fait un cycle pour que vous puissiez l'utiliser à nouveau pour autant de mots que vous le souhaitez: 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

Je pensais à ce problème pour mon propre code et même si je vais probablement utiliser quelque chose de plus simple/plus rapide, voici une autre solution Linq similaire à celle que @Francisco a ajoutée.

Je l’aime juste parce qu’il ressemble le plus à ce que vous voulez réellement faire: "Prenez des caractères alors que la sous-chaîne résultante a moins de 2 espaces."

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());
0
tordal

Il existe des méthodes plus simples pour le faire, comme d’autres l’ont déjà dit, mais vous pouvez également vérifier chaque caractère jusqu’à ce que vous rencontriez un deuxième espace, puis renvoyer la sous-chaîne correspondante.

static string Extract(string str)
{
    bool end = false;
    int length = 0 ;
    foreach (char c in str)
    {
        if (c == ' ' && end == false)
        {
            end = true;
        }
        else if (c == ' ' && end == true)
        {
            break;
        }

        length++;
    }

    return str.Substring(0, length);
}
0
IVlad

Je recommanderais une expression régulière pour cela car elle traite des cas que vous n'avez peut-être pas pris en compte.

var input = "o1 1232.5467 1232.5467 1232.5467 1232.5467 1232.5467 1232.5467";
var regex = new Regex(@"^(.*? .*?) ");
var match = regex.Match(input);
if (match.Success)
{
    Console.WriteLine(string.Format("'{0}'", match.Groups[1].Value));
}
0
Todd Sprang

Vous pouvez essayer de trouver l'indexOf "o1" en premier. Puis extrayez-le . Après cela, divisez la chaîne en utilisant les caractères "1232.5467":

        string test = "o1 1232.5467 1232.5467 1232.5467 1232.5467 1232.5467 1232.5467";
        string header = test.Substring(test.IndexOf("o1 "), "o1 ".Length);
        test = test.Substring("o1 ".Length, test.Length - "o1 ".Length);
        string[] content = test.Split(' ');
0
Erup