2011-08-17 38 views
5

Tôi có một văn bản và sử dụng regex đơn giản này để chia nhỏ nó thành các từ: [ \n]. Nó chia tách văn bản thành các từ bằng cách sử dụng dấu cách và dấu ngắt dòng.Cách tách văn bản bằng regex, nhưng các từ được chia nhỏ tiếp tục giữ dấu phân cách regex?

Tôi muốn biết nếu có cách nào để giữ khoảng trắng hoặc ngắt dòng trong từ được tách ra, vì tôi sẽ sử dụng điều này để phát hiện câu đơn giản sau khi xử lý một số.

Tôi đang sử dụng phương thức String#split.

+0

\ n "Có nghĩa là điều gì đó đặc biệt (kết thúc câu)? Bạn không xử lý các đoạn văn bình thường trên nhiều dòng với "." khi kết thúc câu? – toto2

+0

@ toto2 Dấu chấm câu cũng được sử dụng để xác định kết thúc câu, nhưng nội dung xuất phát từ nội dung HTML, rất nhiều câu như tiêu đề không có dấu chấm câu xác định nơi câu kết thúc, chỉ ngắt dòng. –

+0

Tôi không chắc bạn nên dựa vào \ n khi xử lý HTML, vì bạn có thể có một tài liệu hoàn hảo không có một \ n. – toto2

Trả lời

7

Bạn có thể sử dụng lookbehind như @Piotr Findeisen đề nghị (+1):

public class RegexExample{ 
    public static void main(String[] args) { 
    String s = "firstWordWithSpaceAfter secondWordWithSpaceAfter wordWithLineBreakAfter\nlastWord"; 
    String sa[] = s.split("(?<=[ \\n])"); 
    for (String saa : sa) 
     System.out.println("[" + saa + "]"); 
    } 
} 

Output:

[firstWordWithSpaceAfter ] 
[secondWordWithSpaceAfter ] 
[wordWithLineBreakAfter 
] 
[lastWord] 

lời giải thích ngắn gọn:

?<= là nhìn về phía sau, có nghĩa là bạn có một khớp nếu dữ liệu trước biểu thức bạn đang tìm bằng bằng regex sau ?<= (trong trường hợp này là [ \\n])

[ \\n] là regex đó có nghĩa là một trong những nhân vật trong []

như vậy toàn bộ regex nói chia tay mỗi khi nhân vật trước khi biểu thức/từ là một trong hai không gian hoặc \n.

Vì chúng tôi không cố gắng khớp không gian hoặc \n, nó sẽ không xóa chúng.

+0

Điều này dường như hoạt động, nhưng ... bạn có thể giải thích regex không? –

+0

@Renato Dinhani Conceição - Tôi không phải là chuyên gia về regex, nhưng tôi hy vọng anh ấy chỉnh sửa đủ rõ ràng. – MByD

+0

Bạn đặt regex bên trong dấu ngoặc đơn. Điều này là cần thiết? –

5

Đồng ý sử dụng giao diện/lookahead dương có chiều rộng bằng không. Xem Pattern javadoc xung quanh cấu trúc đặc biệt (không chụp)

0

Tôi nghĩ rằng lựa chọn duy nhất của bạn là để làm một cái gì đó như thế này:

String myString = "Joe Blow\n1234 Fake Road\nHere, There, 12345"; 
String[] lines = myString.split("\\n"); 
Set<String[]> wordsByLine = new LinkedHashSet<String[]>(); 
for (String line : lines) { 
    wordsByline.add(line.split(" ")); 
} 
0

Thật nhanh chóng ra khỏi đỉnh đầu của tôi, nếu regex luôn phù hợp với các ký tự đơn, bạn có thể sử dụng độ dài để xác định nơi chúng nằm trong chuỗi gốc. Sau đó, bạn có thể lấy một chuỗi con cho ký tự phân cách.

Bit bẩn, nhưng nên thực hiện thủ thuật.

-1

Tôi vẫn không chắc chắn bạn đang cố gắng làm gì, nhưng nếu \ n có nghĩa khác thay vì "", bạn nên xử lý riêng chúng.

String[] sentences = text.split("\\n"); 
... 
for (String sentence : sentences) { 
    ... 
    String[] words = sentence.split(" "); 
    ... 
} 
Các vấn đề liên quan