2011-02-10 14 views
6

Tôi muốn chia văn bản thành các câu. Một câu kết thúc bằng dấu chấm (hoặc)? hoặc là ! theo sau là một hoặc nhiều ký tự khoảng trống được theo sau và câu tiếp theo bắt đầu bằng một chữ hoa.Chia văn bản thành các câu trong C#

Ví dụ:

Câu đầu tiên. Câu thứ hai!

Tôi có thể làm như thế nào?

+12

Bạn xử lý như thế nào: * "Khi anh ấy đến nhà, anh ấy hét lên" Này! Có ai ở đó không? ”, Rồi mở cửa và bước vào." * Hay bạn có kiểm soát chặt chẽ đầu vào? –

+0

Tôi đã thêm một biểu thức chính quy trong câu trả lời của tôi xem xét trường hợp này. Tham khảo http://www.regexlib.com/REDetails.aspx?regexp_id=2355 – Thea

+0

@Fredrik Mörk Ví dụ của bạn là một trường hợp đặc biệt thú vị. Tôi sẽ xử lý như một câu duy nhất – Lato

Trả lời

4

Những ngôn ngữ nào bạn muốn hỗ trợ? Ví dụ, trong tiếng Thái không có dấu cách giữa các từ và câu được phân tách bằng dấu cách. Vì vậy, nói chung, nhiệm vụ này rất phức tạp. Cũng xem xét các bình luận hữu ích của Fredrik Mörk.

Vì vậy, lúc đầu, bạn cần phải xác định bộ quy tắc về "câu" là gì. Sau đó, bạn được hoan nghênh sử dụng một trong các giải pháp được đề xuất.

+1

Tôi muốn hỗ trợ chủ yếu là tiếng Anh. Có rất nhiều trạng thái cụ thể. ví dụ tôi phải xem xét chữ viết tắt (Dr. Jekyll) – Lato

+0

cảm ơn bạn rất nhiều! – Lato

5

Bạn đã thử String.Split() chưa? Xem các tài liệu về nó here

+3

có tôi đã làm, nhưng nó là không đủ. Trong văn bản có các liên kết. (Ví dụ: www.mysite.it) – Lato

5

Hãy thử điều này (MSDN)

char[] separators = new char[] {'!', '.', '?'}; 
string[] sentences1 = "First sentence. Second sentence!".Split(separators); 
//or... 
string[] sentences2 = "First sentence. Second sentence!".Split('!', '.', '?'); 
24

Bạn có thể chia trên một biểu thức chính quy phù hợp với không gian màu trắng, với một lookbehind trông cho Terminators câu:

string[] sentences = Regex.Split(input, @"(?<=[\.!\?])\s+"); 

Điều này sẽ chia thành các ký tự khoảng trắng và giữ các ký tự trong các câu.

Ví dụ:

string input = "First sentence. Second sentence! Third sentence? Yes."; 
string[] sentences = Regex.Split(input, @"(?<=[\.!\?])\s+"); 

foreach (string sentence in sentences) { 
    Console.WriteLine(sentence); 
} 

Output:

First sentence. 
Second sentence! 
Third sentence? 
Yes. 
+1

cảm ơn bạn cảm ơn bạn cảm ơn !!!!!!!!!!!!! cảm ơn bạn cảm ơn bạn ..thanks một tấn ... cần thiết này xấu .. đang đấu tranh với string.split() chức năng mà aloows chỉ có nhân vật duy nhất. –

+1

Hãy cẩn thận vì điều này sẽ không hiệu quả với những thứ như "Xin chào ông bà Smith". – Yodacheese

+0

@Yodacheese: Vâng, đó là sự thật. Nó sẽ đòi hỏi một phân tích sâu rộng hơn về ý nghĩa của câu để bắt khi một khoảng thời gian thực sự kết thúc một câu. Hãy xem xét ví dụ các câu "" Danh dự là ông Smith là họ. "'. – Guffa

Các vấn đề liên quan