2009-02-27 49 views

Trả lời

4

Cho một String str:

str = str.replaceAll("\\\\r","") 
str = str.replaceAll("\\\\n","") 
+0

Vết thương. Đánh tôi đi! –

+2

Đây là một cách không hiệu quả không cần thiết để thực hiện. –

2

Bạn đã cố gắng sử dụng các phương pháp replaceAll để thay thế bất kỳ sự xuất hiện của \ n hoặc \ r với chuỗi sản phẩm nào?

110

Regex với replaceAll.

public class Main 
{ 
    public static void main(final String[] argv) 
    { 
     String str; 

     str = "hello\r\njava\r\nbook"; 
     str = str.replaceAll("(\\r|\\n)", ""); 
     System.out.println(str); 
    } 
} 

Nếu bạn chỉ muốn xoá \ r \ n khi họ là cặp (mã trên loại bỏ \ n hoặc \ r hoặc) làm điều này thay vì:

str = str.replaceAll("\\r\\n", ""); 
+8

Tôi khuyên bạn nên sử dụng 'System.getProperty (" line.separator ");', thay vì các bộ ngắt dòng được mã hóa cứng. Mỗi hệ điều hành có bộ tách dòng riêng. – GGrec

+2

Tôi cũng vậy, nhưng câu hỏi cụ thể đã sử dụng \ r và \ n ... – TofuBeer

+2

@GGrec đôi khi chuỗi văn bản/Tệp không được thực hiện bởi cùng một hệ điều hành. Vì vậy, 'System.getProperty (" line.separator ");' sẽ không hoạt động trong những trường hợp này. Nhưng có, nếu bạn có thể tin tưởng nguồn gốc cùng một hệ điều hành, tốt hơn là sử dụng thuộc tính hệ thống. – Mindwin

10

Nếu bạn muốn tránh các regex, hoặc phải nhắm mục tiêu một JVM trước đó, string.Replace() sẽ làm:

str=str.replace("\r","").replace("\n",""); 

Và để loại bỏ một cặp CRLF:

str=str.replace("\r\n",""); 

Cách thứ hai hiệu quả hơn việc xây dựng một regex để làm điều tương tự. Nhưng tôi nghĩ rằng trước đây sẽ nhanh hơn như một regex kể từ khi chuỗi chỉ được phân tích cú pháp một lần.

1
static byte[] discardWhitespace(byte[] data) { 
    byte groomedData[] = new byte[data.length]; 
    int bytesCopied = 0; 

    for (int i = 0; i < data.length; i++) { 
     switch (data[i]) { 
      case (byte) '\n' : 
      case (byte) '\r' : 
       break; 
      default: 
       groomedData[bytesCopied++] = data[i]; 
     } 
    } 

    byte packedData[] = new byte[bytesCopied]; 

    System.arraycopy(groomedData, 0, packedData, 0, bytesCopied); 

    return packedData; 
} 

Mã được tìm thấy trên dự án commons-codec.

-5

Bạn có thử

string.trim(); 

này có nghĩa là để cắt tất cả các hàng đầu và nghiêng trong khi khoảng trống trong chuỗi. Hi vọng điêu nay co ich.

Edit: (Tôi đã không đủ rõ ràng)

Vì vậy, khi bạn String.split(), bạn sẽ có một string [] - cho mỗi chuỗi trong mảng, làm một string.trim () và sau đó nối thêm.

String[] tokens = yourString.split(" "); 
StringBuffer buff = new StringBuffer(); 
for (String token : tokens) 
{ 
    buff.append(token.trim()); 
} 

Sử dụng chuỗiBuffer/Builder thay vì gắn thêm vào cùng một chuỗi.

+0

Vấn đề ở đây là gì? Trim lấy đi tất cả mọi thứ và trả lại chỉ là chuỗi? –

+4

Cắt xóa khoảng trắng đầu/cuối. Ngắt dòng ở giữa một chuỗi sẽ không bị xóa. – Joseph

9
public static void main(final String[] argv) 
{ 
    String str; 

    str = "hello\r\n\tjava\r\nbook"; 
    str = str.replaceAll("(\\r|\\n|\\t)", ""); 
    System.out.println(str); 
} 

Sẽ hữu ích khi thêm tab trong regex.

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