2010-04-08 33 views
19

Tôi có một chuỗi như thế này:Làm cách nào để trích xuất chuỗi con từ chuỗi cho đến khi gặp phải không gian thứ hai?

"o1 1232.5467 1232.5467 1232.5467 1232.5467 1232.5467 1232.5467"

Làm thế nào để giải nén chỉ "o1 1232.5467"?

Số lượng ký tự cần trích xuất không giống nhau. Do đó, tôi muốn chỉ trích xuất cho đến khi không gian thứ hai được gặp phải.

+1

Sẽ luôn có 1 dấu cách giữa các từ? Nếu không, hầu hết các giải pháp dưới đây không hợp lệ. –

Trả lời

4

Sử dụng regex:.

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

Một cách tiếp cận đơn giản sẽ là như sau:

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

Chỉ cần sử dụng String.IndexOf gấp đôi trong:

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

... và nếu bạn đang tìm kiếm từ cuối chuỗi (LastIndexOf), bạn sẽ thay thế 'index-1' trong dòng thứ ba. – Jess

+0

Tôi thích cách tiếp cận này, vì hiệu quả của nó. – Panzercrisis

8

Lấy vị trí của không gian đầu tiên:

int space1 = theString.IndexOf(' '); 

Vị trí của n không gian ext sau đó:

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

Lấy một phần của chuỗi lên đến không gian thứ hai:

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

Đoạn mã trên đưa togehter thành một lớp lót:

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

@ Jeff: cái nào đặc biệt? –

+0

Sử dụng trường hợp Pascal cho các biến; 'MyString' và' WhatIWant'. –

+0

Có thể MyString là tài sản. Dù sao, tôi không áp dụng những quy tắc đó cho những đoạn như thế này. –

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

Something như thế này:

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

Đó là một giải pháp khá đơn giản, hiệu quả và thông minh :) – Siewers

0

Có nhiều cách ngắn hơn để làm việc đó như những người khác đã nói, nhưng bạn cũng có thể kiểm tra từng nhân vật cho đến khi bạn gặp một không gian thứ hai cho mình, sau đó trả lại chuỗi tương ứng.

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

Bạn có thể thử tìm chỉ mụcOf "o1" trước. Sau đó giải nén nó. Sau này, Tách chuỗi bằng cách sử dụng ký tự "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(' '); 
1

Tôi muốn giới thiệu một biểu thức chính quy cho điều này kể từ khi nó xử lý các trường hợp mà bạn có thể không xem xét.

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

Chỉ cần một lưu ý, tôi nghĩ rằng hầu hết các thuật toán ở đây sẽ không kiểm tra xem bạn có 2 hoặc nhiều hơn các không gian với nhau, vì vậy nó có thể nhận được một không gian như từ thứ hai.

Tôi không biết nếu điều đó một cách tốt nhất, nhưng tôi đã có một niềm vui nho nhỏ Linqing nó: P (điều tốt là nó cho phép bạn chọn số lượng dấu cách/từ bạn muốn để mất)

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

tôi cũng có @ câu trả lời ho và biến nó thành một chu kỳ, do đó bạn lại có thể sử dụng nó cho càng nhiều từ như bạn muốn: 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

tôi đã suy nghĩ về vấn đề này cho mã của riêng tôi và mặc dù Tôi có lẽ sẽ kết thúc bằng cách sử dụng một cái gì đó đơn giản/nhanh hơn, đây là một giải pháp LINQ đó là tương tự như một mà @ Fancancisco một dded.

Tôi chỉ thích nó vì nó đọc giống như những gì bạn thực sự muốn làm: "Lấy ký tự trong khi chuỗi con kết quả có ít hơn 2 dấu cách."

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()); 
Các vấn đề liên quan