2012-02-29 7 views
9

Estoy tratando de extraer algo de un correo electrónico. El formato general del correo electrónico siempre será:Extraer parte de una cadena entre el punto A y B

blablablablabllabla hello my friend. 

[what I want] 

Goodbye my friend blablablabla 

Ahora que lo hice:

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

Esto me dará un punto antes de que comience, y un punto después de iniciarse. ¿Qué método puedo usar para esto? He encontrado:

String.Substring(Int32, Int32) 

Pero esto sólo lleva a la posición de inicio.

¿Qué puedo usar?

+0

¿Qué pasa si el correo electrónico se inicia con "Adiós mi amigo" y termina con "hola mi amigo" o nada en absoluto? ¿Estás seguro de que este es un enfoque viable? –

+0

Sí, estoy seguro, es un correo electrónico automático. Siempre será enviado así. Además, mi programa leerá desde un archivo de definición, siempre puedo cambiar las cadenas. – TheGateKeeper

Respuesta

15

Subcadena toma el índice de inicio (basado en cero) y el número de caracteres que desea copiar.

Tendrá que hacer algunos cálculos, como esto:

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

es probable que desee poner las constantes de cadena en un const string.

+1

Hola, gracias, esto funcionará. Sin embargo, no es necesario agregar la cadena después del método LastIndexOf, porque esto ya le da la última posición. Aclamaciones. – TheGateKeeper

+0

Sí, necesita agregarlo ... a menos que también desee "hola, amigo" en la salida. Pruébalo ... lo hice. –

+0

Tienes razón, pero ¿por qué sucede esto? email.LastIndexOf ("hola mi amigo") ¿no daría esto el índice del personaje después de "amigo"? – TheGateKeeper

-1

tratar myStr.substring(start,end);

+0

¿Qué? Acabo de enumerar eso en la pregunta. Ese método toma el inicio y la duración, no el inicio y el final. – TheGateKeeper

+0

desde [docs] (http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/String.html): subcadena (int beginIndex, int endIndex) Devuelve una nueva cadena esa es una subcadena de esta cadena. Y pensé que estabas hablando de una función estática de String, no del método de instancia, lo siento. –

+0

Np amigo, gracias de todos modos. – TheGateKeeper

4

también puede utilizar expresiones regulares

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

RegEx puede ser bastante lento en comparación con la manipulación directa de cadenas. No estoy seguro de si le importa al OP o no. –

+0

Nunca he sido fan de Regex ... principalmente porque no sé cómo usarlo. ¿Puedes explicar cómo funciona esa forumla? – TheGateKeeper

+0

@TheGateKeeper encuentra todos los caracteres '(. +)' Entre 'hello my friend' y' Goodbye my friend'. Paranthesis son para obtener los caracteres combinados en el grupo [1] (no toda la cadena hola ....... amigo) –

2

Simplemente puede calcular la longitud desde el principio y al final

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

También debe tener en cuenta la duración de "hola, amigo". Tu código también captará esa frase de marcador. –

+0

Gracias, similar a la primera respuesta. – TheGateKeeper

+0

@Eric sí lo tengo correcto –

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