2012-02-29 14 views
9

Próbuję wyodrębnić coś z wiadomości e-mail. Ogólny format wiadomości e-mail zawsze będą:Wyodrębnij część ciągu między punktami A i B

blablablablabllabla hello my friend. 

[what I want] 

Goodbye my friend blablablabla 

Teraz zrobiłem:

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

To da mi punkt przed jego rozpoczęciem, a punkt po uruchomieniu. Jaką metodę mogę użyć do tego? Znalazłem:

String.Substring(Int32, Int32) 

Ale to zajmuje tylko pozycję początkową.

Co mogę użyć?

+0

Co się stanie, jeśli e-mail zaczyna się od „Żegnaj przyjacielu” i kończy „Hello my friend” lub w ogóle nic? Czy jesteś pewien, że jest to opłacalne podejście? –

+0

Tak, jestem pewien, że jest to automatyczny e-mail. Zawsze będzie wysyłane w ten sposób. Dodatkowo mój program odczyta z pliku definicji, zawsze mogę zmienić ciągi znaków. – TheGateKeeper

Odpowiedz

15

podciągu potrzebny indeks początkowy (od zera), a liczba znaków, które chcesz skopiować.

Musisz zrobić trochę matematyki, tak:

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

Prawdopodobnie chcesz umieścić stałe ciągów znaków w const string.

+1

Cześć, dziękuję, to zadziała. Jednakże nie ma potrzeby dodawania łańcucha po metodzie LastIndexOf, ponieważ daje to już ostatnią pozycję. Twoje zdrowie. – TheGateKeeper

+0

Tak, musisz go dodać ... chyba że chcesz również "cześć, mój przyjacielu" na wyjściu. Wypróbuj ... Zrobiłem. –

+0

Masz rację, ale dlaczego tak się dzieje? email.LastIndexOf ("cześć, mój przyjacielu") czy nie dałby tego indeksu postaci po "przyjacielu"? – TheGateKeeper

-1

spróbować myStr.substring(start,end);

+0

Co? Właśnie o tym wspomniałem w pytaniu. Ta metoda przyjmuje początek i długość, a nie początek i koniec. – TheGateKeeper

+0

z [docs] (http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/String.html): substring (int beginIndex, int endIndex) Zwraca nowy ciąg to jest podciąg tego łańcucha. I myślałem, że mówisz o statycznej funkcji z String, a nie o metodzie instancji, przepraszam. –

+0

Np mate, dzięki mimo to. – TheGateKeeper

4

można również użyć wyrażenia regularnego

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

RegEx może być dość powolny w porównaniu do bezpośredniego manipulowania ciągami. Nie jestem pewien, czy ma to znaczenie dla PO, czy nie. –

+0

Nigdy nie byłem fanem regex ... głównie dlatego, że nie wiem jak z niego korzystać. Czy możesz wyjaśnić, jak działa to forumla? – TheGateKeeper

+0

@GateKeeper znajduje wszystkie znaki '(. +)' Pomiędzy 'hello my friend' oraz' Goodbye my friend'. Paranteza służy do uzyskania dopasowanych znaków w grupie [1] (nie cały ciąg hello ....... przyjaciel) –

2

Można po prostu obliczyć długość od początku i końca

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

Musisz również uwzględnić długość "cześć mój przyjacielu". Twój kod również chwyci tę frazę znacznika. –

+0

Dzięki, podobnie jak pierwsza odpowiedź. – TheGateKeeper

+0

@Eric yeah, ale to poprawne –

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(); 
Powiązane problemy