2012-02-29 30 views
9

Tôi đang cố gắng trích xuất nội dung nào đó từ email. Định dạng chung của email sẽ luôn là:Trích xuất một phần của chuỗi giữa điểm A và B

blablablablabllabla hello my friend. 

[what I want] 

Goodbye my friend blablablabla 

Bây giờ tôi đã làm:

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

này sẽ cung cấp cho tôi một điểm trước khi nó bắt đầu, và một điểm sau khi nó bắt đầu. Tôi có thể sử dụng phương pháp nào cho điều này? Tôi tìm thấy:

String.Substring(Int32, Int32) 

Nhưng điều này chỉ có vị trí bắt đầu.

Tôi có thể sử dụng những gì?

+0

gì sẽ xảy ra nếu các email bắt đầu với "Tạm biệt người bạn của tôi" và kết thúc với "hello người bạn của tôi" hay gì cả? Bạn có chắc chắn rằng đây là một cách tiếp cận khả thi? –

+0

Có, tôi chắc chắn, đây là một email tự động. Nó sẽ luôn luôn được gửi như thế này. Cộng với chương trình của tôi sẽ đọc từ một tệp định nghĩa, tôi luôn có thể thay đổi các chuỗi. – TheGateKeeper

Trả lời

15

xâu có chỉ số bắt đầu (zero-based) và số lượng các ký tự mà bạn muốn sao chép.

Bạn sẽ cần phải làm một số toán học, như thế này:

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

Bạn có thể muốn đặt hằng số chuỗi trong một const string.

+1

Xin chào, cảm ơn, điều này sẽ làm việc. Tuy nhiên, không cần phải thêm chuỗi sau phương thức LastIndexOf, vì điều này cho bạn vị trí cuối cùng. Chúc mừng. – TheGateKeeper

+0

Có, bạn cần phải thêm nó ... trừ khi bạn cũng muốn "chào bạn của tôi" ở đầu ra. Hãy thử nó ... Tôi đã làm. –

+0

Bạn nói đúng, nhưng tại sao điều này lại xảy ra? email.LastIndexOf ("xin chào bạn của tôi") sẽ không này cung cấp cho các chỉ số của nhân vật sau khi "người bạn"? – TheGateKeeper

-1

thử myStr.substring(start,end);

+0

Cái gì? Tôi chỉ liệt kê điều đó trong câu hỏi. Phương thức đó bắt đầu và chiều dài, không bắt đầu và kết thúc. – TheGateKeeper

+0

từ [tài liệu] (http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/String.html): chuỗi con (int beginIndex, int endIndex) Trả về chuỗi mới đó là một chuỗi con của chuỗi này. Và tôi nghĩ bạn đang nói về một hàm tĩnh từ String, không phải phương thức cá thể, xin lỗi. –

+0

Np mate, cảm ơn anyway. – TheGateKeeper

4

bạn cũng có thể sử dụng Regex

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

RegEx có thể khá chậm so với thao tác chuỗi trực tiếp. Không chắc chắn nếu nó quan trọng với OP hay không. –

+0

Không bao giờ là một fan hâm mộ của regex ... chủ yếu là vì tôi không biết làm thế nào để sử dụng nó. Bạn có thể giải thích cách forumla đó hoạt động không? – TheGateKeeper

+0

@ TheGateKeeper nó tìm tất cả các ký tự '(. +)' Giữa 'hello my friend' và' Goodbye my friend'. Paranthesis là để nhận được các ký tự phù hợp trong nhóm [1] (không phải là toàn bộ chuỗi hello ....... người bạn) –

2

Bạn chỉ có thể tính toán chiều dài từ đầu và kết thúc

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

Bạn cũng cần tính đến thời lượng "hello my friend". Mã của bạn cũng sẽ lấy cụm từ đánh dấu đó. –

+0

Cảm ơn, tương tự như câu trả lời đầu tiên. – TheGateKeeper

+0

@Eric yeah có đúng –

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