2015-02-03 14 views
20

tôi đã nhập vào một tập tin đầu vào mà tôi cần để xử lý và loại bỏ tất cả các màu trắng-không gian, bao gồm khoảng trắng không bị phá vỡ U+00A0 aka   (Bạn có thể tạo ra nó trong Notepad bằng cách nhấn Alt và sau đó gõ từ bàn phím số của bàn phím.) Hoặc bất kỳ hình thức không gian màu trắng nào khác. Tôi đã thử String.trim() nhưng nó không cắt U+00A0.Làm thế nào để cắt không gian trống trong Java?

Tôi có cần kiểm tra rõ ràng U+00A0 và sau đó trim() hoặc có cách dễ dàng để cắt tất cả các loại khoảng trắng trong Java không?

+0

điều gì về 'Chuỗi' thay thế biến thể? –

+2

Khi bạn nói "tất cả", ý bạn là * tất cả *? – ChiefTwoPencils

+0

yup, thay thế làm việc. :) Không nghĩ về nó trước đó: | Sự khác biệt giữa "tất cả" & _all_ là gì? – Abhishek

Trả lời

27

Trong khi   là một non breaking space (một không gian mà không muốn được đối xử như khoảng trắng), bạn có thể cắt chuỗi trong khi vẫn giữ lại mọi số   trong chuỗi bằng một regex đơn giản:

string.replaceAll("(^\\h*)|(\\h*$)","") 
  • \h là một nhân vật khoảng trắng ngang: [ \t\xA0\u1680\u180e\u2000-\u200a\u202f\u205f\u3000]

Nếu bạn đang sử dụng một JDK8 Version trước, bạn cần phải sử dụng một cách rõ ràng danh sách các ký tự thay vì \h.

+0

Đây là giải pháp sạch và tổng quát nhất cho đến nay. Đáng nói rằng '\ h' chỉ có sẵn từ Java 8 nhưng trong các phiên bản trước, bạn có thể sử dụng phạm vi rõ ràng được đưa ra trong câu trả lời của bạn. – 5gon12eder

+0

Thật tuyệt vời! Chính xác là một lớp lót sẽ chăm sóc tất cả các loại không gian. – Abhishek

+0

Một điều có thể hữu ích nếu bạn biết là chúng có Phân loại Không gian Unicode. Tôi thích trang này như là một tham chiếu đến những gì được bao gồm, vì các công cụ chính thức Unicode là một chút khô: [Space Separators] (http://www.fontspace.com/unicode/category/space-separator) – Steve

15

U+0160 không phải là khoảng trắng, vì vậy nó sẽ không được cắt. Nhưng bạn có thể chỉ đơn giản là replace() rằng các ký tự có dấu cách và sau đó gọi trim(), do đó bạn giữ khoảng trắng nằm trong chuỗi của bạn.

string = string.replace('\u00A0',' ').trim() 

three non-breaking whitespace ký tự được loại trừ khỏi các phương pháp Character.isWhitespace(): \u00A0, \u2007\u202F, vì vậy bạn có thể muốn thay thế những người quá.

+0

Nó hoạt động !! Cảm ơn :) Tôi giả sử, tôi cần phải xử lý tất cả các khoảng trắng (http://en.wikipedia.org/wiki/Whitespace_character) một cách rõ ràng và từng người một, phải không? – Abhishek

+0

'trim()' sẽ xử lý tất cả các ký tự được liệt kê dưới dạng khoảng trắng java, vì vậy bạn không cần phải thêm tất cả các ký tự khoảng trắng. Xem tại đây: http://docs.oracle.com/javase/8/docs/api/java/lang/Character.html#isWhitespace-char- – RobAu

2

Bạn có thể làm điều đó với một ổi CharMatcher, ví dụ:

CharMatcher.anyOf("\r\n\t \u00A0").trimFrom(input); 

Xem thêm này nice reference on whitespaces definition

+2

Có nhiều ký tự khoảng trắng hơn mà bạn đã đặt trong danh sách của mình. – RobAu

1

Nếu bạn tình cờ sử dụng Apache Commons Lang thì bạn có thể sử dụng strip và thêm tất cả các ký tự bạn muốn.

final String STRIPPED_CHARS = " \t\u00A0\u1680\u180e\u2000\u200a\u202f\u205f\u3000"; 

String s = "\u3000 \tThis str contains a non-breaking\u00A0space and a\ttab. "; 
s = StringUtils.strip(s, STRIPPED_CHARS); 
System.out.println(s); // Gives : "This str contains a non-breaking space and a tab." 
Các vấn đề liên quan