2012-02-29 10 views
9

Sto cercando di estrarre qualcosa da una e-mail. Il formato generale della mail sarà sempre:Estrarre parte di una stringa tra il punto A e il B

blablablablabllabla hello my friend. 

[what I want] 

Goodbye my friend blablablabla 

Ora ho fatto:

    string.LastIndexOf("hello my friend"); 
        string.IndexOf("Goodbye my friend"); 

Questo mi darà un punto prima del suo inizio, e un punto dopo l'avvio. Che metodo posso usare per questo? Ho trovato:

String.Substring(Int32, Int32) 

Ma questo prende solo la posizione di partenza.

Cosa posso usare?

+0

Cosa succede se l'e-mail inizia con "Addio mio amico" e termina con "ciao mio amico" o niente del tutto? Sei sicuro che questo sia un approccio praticabile? –

+0

Sì, sono sicuro, è un'e-mail automatica. Sarà sempre inviato in questo modo. Inoltre il mio programma leggerà da un file di definizione, posso sempre modificare le stringhe. – TheGateKeeper

risposta

15

Substring prende l'indice di partenza (zero-based) e il numero di caratteri che si desidera copiare.

Avrai bisogno di fare un po 'di matematica, in questo modo:

string email = "Bla bla hello my friend THIS IS THE STUFF I WANTGoodbye my friend"; 
int startPos = email.LastIndexOf("hello my friend") + "hello my friend".Length + 1; 
int length = email.IndexOf("Goodbye my friend") - startPos; 
string sub = email.Substring(startPos, length); 

Probabilmente vogliono mettere le costanti di stringa in un const string.

+1

Ciao, grazie, funzionerà. Tuttavia, non è necessario aggiungere la stringa dopo il metodo LastIndexOf, poiché ciò fornisce già l'ultima posizione. Saluti. – TheGateKeeper

+0

Sì, è necessario aggiungerlo ... a meno che non si desideri anche "ciao amico" nell'output. Provalo ... L'ho fatto. –

+0

Hai ragione, ma perché succede? email.LastIndexOf ("ciao amico mio") non darebbe l'indice del personaggio dopo "amico"? – TheGateKeeper

-1

provare myStr.substring(start,end);

+0

Cosa? L'ho appena elencato nella domanda. Quel metodo prende l'inizio e la lunghezza, non l'inizio e la fine. – TheGateKeeper

+0

da [docs] (http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/String.html): sottostringa (int beginIndex, int endIndex) Restituisce una nuova stringa questa è una sottostringa di questa stringa. E ho pensato che stavi parlando di una funzione statica da String, non il metodo di istanza, mi dispiace. –

+0

NP amico, grazie comunque. – TheGateKeeper

4

è anche possibile utilizzare Regex

string s = Regex.Match(yourinput, 
         @"hello my friend(.+)Goodbye my friend", 
         RegexOptions.Singleline) 
      .Groups[1].Value; 
+0

RegEx può essere piuttosto lento rispetto alla manipolazione diretta delle stringhe. Non sono sicuro se è importante per l'OP o no. –

+0

Non sono mai stato un fan delle regex ... soprattutto perché non so come usarlo. Puoi spiegare come funziona questo forum? – TheGateKeeper

+0

@TheGateKeeper trova tutti i caratteri '(. +)' Tra 'ciao amico mio' e' Arrivederci amico mio'. Paranthesis per ottenere i caratteri combinati nel gruppo [1] (non tutta la stringa ciao ....... amico) –

2

Si può semplicemente calcolare la lunghezza fin dall'inizio e alla fine

const string startText = "hello my friend"; 
var start = str.LastIndexOf(startText) + startText.Length; 
var end = str.IndexOf("Goodbye my friend"); 
var length = end -start; 
str.Substring(start,length); 
+0

È necessario tenere conto della lunghezza di "ciao amico mio" anche. Il tuo codice prenderà anche quella frase marcatore. –

+0

Grazie, simile alla prima risposta. – TheGateKeeper

+0

@Eric sì, è corretto –

1
string s1 = "find a string between within a lengthy string"; 
string s2 = s1.IndexOf("between").ToString(); 
string output = s1.Substring(0, int.Parse(s2)); 
Console.WriteLine("string before between is : {0}", output); 
Console.ReadKey(); 
Problemi correlati