2010-04-08 3 views
19

Ich habe eine Zeichenfolge wie folgt:Wie extrahiere ich eine Teilzeichenfolge aus einer Zeichenfolge, bis das zweite Leerzeichen gefunden wird?

"o1 1232.5467 1232.5467 1232.5467 1232.5467 1232.5467 1232.5467"

Wie extrahiere ich nur "o1 1232.5467"?

Die Anzahl der zu extrahierenden Zeichen ist nicht immer gleich. Daher möchte ich nur extrahieren, bis der zweite Raum angetroffen wird.

+1

Wird es immer nur 1 Leerzeichen zwischen Wörtern geben? Wenn nicht, sind die meisten der folgenden Lösungen ungültig. –

Antwort

4

Verwenden Sie eine Regex:.

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

Ein einfacher Ansatz wäre die folgende:

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

Nur String.IndexOf verwenden doppelt so in:

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

... und wenn Sie am Ende eines Strings (LastIndexOf) suchen, würden Sie in der dritten Zeile "index-1" ersetzen. – Jess

+0

Ich bevorzuge diesen Ansatz, wegen seiner Effizienz. – Panzercrisis

8

die Position des ersten Raumes Get:

int space1 = theString.IndexOf(' '); 

Die Position des n ext Raum danach:

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

den Teil der Zeichenfolge Holen auf den zweiten Platz:

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

Die togehter setzen obige Code in einen Ein-liner:

string firstPart = theString.Substring(0, theString.IndexOf(' ', theString.IndexOf(' ') + 1)); 
1
string[] parts = myString.Split(" "); 
string whatIWant = parts[0] + " "+ parts[1]; 
+0

@Jeff: welche besonders? –

+0

Verwendung von Pascal-Fall für Variablen; 'MyString' und' WhatIWant'. –

+0

Vielleicht MyString ist eine Eigenschaft. Wie auch immer, ich wende diese Regeln nicht auf Schnipsel wie diese an. –

5
s.Substring(0, s.IndexOf(" ", s.IndexOf(" ") + 1)) 
1
string testString = "o1 1232.5467 1232.5467........."; 

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

Etwas wie folgt aus:

int i = str.IndexOf(' '); 
i = str.IndexOf(' ', i + 1); 
return str.Substring(i); 
+0

Das war eine ziemlich einfache, effiziente und clevere Lösung :) – Siewers

0

Es gibt kürzere Wege, es zu tun, wie andere gesagt haben, aber Sie können auch jedes Zeichen überprüfen, bis Sie einen zweiten Raum begegnen sich, dann wieder die entsprechende Teilkette.

0

Sie könnten zuerst versuchen, den IndexOf "o1" zu finden. Dann extrahiere es. Danach spaltete sich die Zeichenfolge die Zeichen „1232,5467“ mit:

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

Ich würde einen regulären Ausdruck für diese empfehlen, da es Fälle behandelt, die Sie möglicherweise nicht in Betracht gezogen.

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)); 
} 
1

: P

Nur ein Hinweis, ich denke, dass die meisten der hier gewohnt Algorithmen prüfen, ob Sie zwei oder mehr Räume haben zusammen, so könnte es einen Raum als zweites Wort bekommen.

Ich weiß die beste Art und Weise nicht, wenn es, aber ich hatte ein wenig Spaß Linqing es: P (die gute Sache ist, dass es können Sie die Anzahl der Leerzeichen/Wörter, die Sie nehmen wollen wählen)

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

ich habe auch @ ho Antwort und es in einen Zyklus gemacht, so dass Sie wieder es für so viele Wörter verwenden können, wie Sie wollen: 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); 
0

ich über dieses Problem für meinen eigenen Code zu denken und obwohl Ich werde wahrscheinlich am Ende etwas einfacher/schneller verwenden, hier ist eine andere Linq-Lösung, die einem @ Francisco a ähnlich ist dded.

Ich mag es einfach, weil es am ähnlichsten liest, was Sie eigentlich tun möchten: "Nehmen Sie Zeichen, während der resultierende Teilstring weniger als 2 Leerzeichen hat."

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