2017-02-16 4 views
1

Wie die ersten zwei Wörter eines StringsWie überspringen in C# 2 Wörter aus einer Zeichenkette beginnen

wie ignorieren:

String x = "hello world this is sample text"; 

in dieser die ersten beiden Worte Hallo Welt sind, so will ich um sie zu überspringen, aber nächstes Mal vielleicht werden die Wörter nicht die gleichen sein, wie vielleicht werden sie, "Hakuna Matata", aber das Programm sollte sie auch überspringen.

P.S: nicht vorschlagen, Zeichen zu entfernen, wird es hier nicht funktionieren, ich denke, weil wir nicht wissen, was die Länge dieser Wörter ist, wollen wir nur die ersten beiden Wörter überspringen. und drucke den Rest aus.

+2

den zweiten Raum zu finden und bekommen was – vu1p3n0x

+1

Substring aus dem zweiten Index des Raum Zeichen nach links bis zum Ende der Zeichenfolge. – David

Antwort

4

Bitte versuchen Sie diesen Code:

String x = "hello world this is sample text"; 

    var y = string.Join(" ", x.Split(' ').Skip(2)); 

Es wird Zeichenfolge durch Leerzeichen geteilt, überspringen zwei Elemente dann alle Elemente in einer Zeichenfolge verbinden.

UPDATE:

Wenn Sie zusätzliche Leerzeichen haben als erste zusätzliche Leerzeichen entfernen und Wörter entfernen:

String x = "hello world this is sample text"; 
x = Regex.Replace(x, @"\s+", " "); 
var y = string.Join(" ", x.Split(' ').Skip(2)); 

UPDATE:

Auch zusätzliche Leerzeichen zu vermeiden, wie von Dai (im folgenden Kommentar) habe ich Split() mit StringSplitOptions verwendet:

String x = "hello  world  this is  sample text"; 
var y = string.Join(" ", x.Split((char[])null, StringSplitOptions.RemoveEmptyEntries).Select(i => i.Trim()).Skip(2)); 
+1

Das Standardverhalten von 'String.Split (Char)' führt zu leeren Elementen, wenn sequenzielle Übereinstimmungszeichen vorhanden sind, und die Verwendung von '' ''passt nur Leerzeichen an. Ich schlage stattdessen vor, 'String.Split (null, StringSplitOptions.RemoveEmptyEntries)' 'zu verwenden (das mit allen Leerraumelementen übereinstimmt und keine Duplikate enthält). – Dai

+0

Danke @ kat1330 –

0

Ich empfehle nicht, IndexOf zu verwenden, weil es Ihnen im Fall von aufeinander folgenden Leerzeichen nicht hilft, und die Verwendung von String.Split(null) mit String.Join ist ineffizient. Sie können dies tun, einen regulären Ausdruck oder FSM-Parser:

Int32 startOfSecondWord = -1; 

Boolean inWord = false; 
Int32 wordCount = 0; 
for(int = 0; i < input.Length; i++) { 
    Boolean isWS = Char.IsWhitespace(input[i]); 
    if(inWord) { 
     if(isWS) inWord = false; 
    } 
    else { 
     if(!isWS) { 
      inWord = true; 
      wordCount++; 

      if(wordCount == 2) { 
       startOfSecondWord = i; 
       break; 
      } 
     } 
    } 
} 

if(startOfSecondWord > -1) return input.Substring(startOfSecondWord); 
+0

@Andrew Es ist nicht kompliziert, wenn Sie bereits vertraut sind mit State-Machine-Konstruktion, obwohl ich weiß, dass es auf den ersten Blick einschüchternd aussieht. Ein Vorteil dieses Ansatzes ist die reine Geschwindigkeit: Es gibt keine internen Zuordnungen und es läuft in 'O (n)' Zeit, ohne den gesamten String bis zum 'Substring'-Aufruf zu durchlaufen. – Dai

0

einen regulären Ausdruck sollte es tun:

using System; 
using System.Text.RegularExpressions; 

public class Example 
{ 
    public static void Main() 
    { 
     string input = "hello world this is sample text"; 
     string pattern = @"(\w+\s+){2}(.*)"; 
     string replacement = "$1"; 
     Regex rgx = new Regex(pattern); 
     string result = rgx.Replace(input, replacement); 

     Console.WriteLine("Original String: {0}", input); 
     Console.WriteLine("Replacement String: {0}", result);        
    } 
} 
Verwandte Themen