2012-06-15 22 views
21

Câu hỏi khá cơ bản đối với người biết.Thay thế dòng mới/trả về bằng không gian bằng cách sử dụng regex

Thay vì nhận được từ

"This is my text. 

And here is a new line" 

Để:

"This is my text. And here is a new line" 

tôi nhận được:

"This is my text.And here is a new line. 

Bất cứ ý tưởng tại sao?

L.replaceAll("[\\\t|\\\n|\\\r]","\\\s"); 

Tôi nghĩ rằng tôi đã tìm ra thủ phạm.

Trên dòng sau tôi làm như sau:

L.replaceAll("[^a-zA-Z0-9|^!|^?|^.|^\\s]", ""); 

Và điều này dường như được gây ra vấn đề của tôi.

Bất kỳ ý tưởng nào tại sao?

Tôi rõ ràng đang cố gắng thực hiện những việc sau: xóa tất cả không phải ký tự và xóa tất cả các dòng mới.

+3

Bạn có thể làm 'L.replaceAll (" [\\\ t | \\\ n | \\\ r] "," ");'? – benjer3

+0

tôi đã thử và điều này dường như không hoạt động. –

+2

'L.replaceAll (" \\ s + "," ")'? –

Trả lời

44

\s là lối tắt cho các ký tự khoảng trắng trong regex. Nó không có ý nghĩa trong một chuỗi. ==> Bạn không thể sử dụng nó trong chuỗi thay thế của mình. Ở đó bạn cần phải đặt chính xác (các) ký tự mà bạn muốn chèn vào. Nếu đây là không gian chỉ cần sử dụng " " làm phương án thay thế.

Điều khác là: Tại sao bạn sử dụng 3 dấu gạch chéo ngược làm chuỗi thoát? Hai là đủ trong Java. Và bạn không cần | (toán tử thay thế) trong một lớp nhân vật.

L.replaceAll("[\\t\\n\\r]+"," "); 

Ghi chú

L không được thay đổi. Nếu bạn muốn có kết quả là bạn cần để làm mã

String result =  L.replaceAll("[\\t\\n\\r]+"," "); 

Test:

String in = "This is my text.\n\nAnd here is a new line"; 
System.out.println(in); 

String out = in.replaceAll("[\\t\\n\\r]+"," "); 
System.out.println(out); 
+0

'L.replaceAll (" [\\ t | \\ n | \\ r] "," ");' cũng có vẻ không hoạt động. –

+0

đã cố gắng này cũng như bây giờ. không may mắn. –

+1

Bạn có thể muốn thêm một '+' sau lớp nhân vật, do đó bạn chỉ có một khoảng trống cho mỗi chuỗi ký tự khoảng trắng. –

2

regex của bạn là altough tốt tôi sẽ thay thế nó với chuỗi rỗng

String resultString = subjectString.replaceAll("[\t\n\r]", ""); 

Bạn mong đợi một khoảng trống giữa "văn bản". và "Và" phải không?

tôi nhận được không gian mà khi tôi cố gắng regex bằng cách sao chép mẫu của bạn

"This is my text. " 

Vì vậy, tất cả là tốt ở đây. Có lẽ nếu bạn chỉ thay thế nó bằng chuỗi rỗng nó sẽ hoạt động. Tôi không biết tại sao bạn thay thế bằng \ s. Và luân phiên | không cần thiết trong lớp nhân vật.

+0

Tôi không làm jave nhưng có thực sự cần thiết để đặt một ký tự thoát thêm như \\ t? Không đủ? – buckley

+0

bạn đang sử dụng trình soạn thảo văn bản của mình như thế nào? –

+0

Ultraedit trên cửa sổ để dòng mới là \ r \ n – buckley

7

Hãy thử

L.replaceAll("(\\t|\\r?\\n)+", " "); 

Tùy thuộc vào hệ thống một linefeed là một trong hai \r\n hoặc chỉ \n.

+0

Điều này là sai. '?' nghĩa là dấu chấm hỏi bằng chữ trong một lớp ký tự (giống như '|' cũng là một chữ ở đây). Và bốn dấu gạch chéo ngược là quá mức cần thiết, ngay cả đối với Java. EDIT: Nhưng đó là lỗi @ adarshr vì không đưa ra các dấu gạch chéo ngược thêm khi định dạng lại câu trả lời :) –

+0

Bạn là chính xác. Điều này với paranthesis nên làm việc mặc dù. – Keppil

+0

Ồ, xin lỗi, tôi đã không nhận ra điều đó. Rất vui vì nó đã được sửa. – adarshr

3

Tôi tìm thấy this.

String newString = string.replaceAll("\n", " "); 

Mặc dù, khi bạn có đường đôi, bạn sẽ nhận được một không gian đôi. Tôi đoán bạn sau đó có thể làm một thay thế tất cả để thay thế không gian đôi với một duy nhất.

Nếu điều đó không làm việc cố gắng thực hiện:

string.replaceAll(System.getProperty("line.separator"), " "); 

Nếu tôi tạo dòng trong "chuỗi" bằng cách sử dụng "\ n" Tôi đã phải sử dụng "\ n" trong regex. Nếu tôi sử dụng System.getProperty() tôi đã phải sử dụng nó.

-1

Bạn có thể sử dụng phân tách đầu tiên và tham gia lại bằng không gian trắng. nó sẽ làm việc chắc chắn.

String[] Larray = L.split("[\\n]+"); 
L = ""; 
for(int i = 0; i<Larray.lengh; i++){ 
    L = L+" "+Larray[i]; 
} 
Các vấn đề liên quan