2009-11-30 76 views
29

Tôi đang tìm biểu thức chính quy trong Java khớp với tất cả các ký tự khoảng trắng trong một Chuỗi. "\ s" chỉ khớp với một số, nó không khớp với   và các khoảng trắng không phải ascii tương tự. Tôi đang tìm một biểu thức chính quy phù hợp với tất cả các ký tự khoảng trắng (phổ biến) có thể xuất hiện trong một chuỗi Java.Biểu thức chính quy Java để khớp với các ký tự khoảng trắng _all_

[Chỉnh sửa]

Để làm rõ: Tôi không có ý trình tự chuỗi " " Ý tôi là nhân vật sincle unicode U + 00A0 mà thường được đại diện bởi " ", ví dụ trong HTML và tất cả các ký tự unicode khác có dấu cách không gian trắng tương tự, ví dụ: "NARROW NO-BREAK SPACE" (U + 202F), từ joiner được mã hóa trong Unicode 3.2 trở lên là U + 2060, "ZERO WIDTH NO-BREAK SPACE" (U + FEFF) và bất kỳ ký tự nào khác có thể được regareded như trắng- không gian.

[trả lời]

Đối pupose của tôi, tức là bắt tất cả các ký tự khoảng trắng, unicode + truyền thống, biểu thức sau đây không được công việc:

[\p{Z}\s]

Câu trả lời là trong các ý kiến ​​dưới đây nhưng kể từ nó là một chút ẩn tôi lặp lại nó ở đây.

+2

Để được rõ ràng, bạn có nghĩa ** nghĩa đen ** '  'hoặc sản lượng của nó' \ u00A0'? Điều đó tạo nên sự khác biệt. – BalusC

+0

  's đầu ra? Đầu ra bởi cái gì? –

+1

@Vinko: Trình duyệt web chẳng hạn. – BalusC

Trả lời

11

  chỉ là khoảng trắng trong HTML. Sử dụng HTML parser để trích xuất văn bản thuần túy. và \s chỉ hoạt động tốt.

+0

' ' tạo '\ u00A0' ở cuối. – BalusC

+0

@BalusC: vâng, nhưng điều quan trọng là bất kỳ định nghĩa lành mạnh nào về "ký tự trắng" trong ngữ cảnh của regex chỉ có thể bao gồm U + 00A0 được tạo ra "ở cuối", nhưng không bao giờ có chữ "'   '". Đó là những gì "Bạn đang trộn mức trừu tượng ở đây" của câu trả lời Vinkos là về (nếu tôi hiểu nó một cách chính xác). –

+15

@BalusC: Không biết HTLM Parser đã làm điều đó. Bạn có thể sử dụng '\ p {Z}' thay vì '\ s' để khớp với khoảng trắng, nó sẽ khớp với' \ u00A0' – Andomar

35

& nbsp; không phải là một ký tự khoảng trắng, theo như các regexpes có liên quan. Bạn cần phải sửa đổi regexp để bao gồm các chuỗi đó ngoài \ s, như/(\ s | & nbsp; |% 20) /, hoặc phân tích trước nội dung chuỗi để có được biểu diễn dữ liệu ASCII hoặc Unicode.

Bạn đang trộn các mức trừu tượng tại đây. Nếu, điều gì sau khi đọc lại câu hỏi có vẻ như là đúng, bạn đang theo một cách để khớp tất cả các ký tự khoảng trắng tham chiếu đến ASCII tiêu chuẩn cộng với các điểm mã vùng trắng, \p{Z} hoặc \p{Zs} sẽ thực hiện công việc.

Bạn thực sự nên làm rõ câu hỏi của mình vì câu hỏi đã làm sai nhiều người (thậm chí làm cho câu trả lời đúng để có một số câu trả lời).

+0

'\ p {javaWhitespace}' dường như không khớp với '& nbsp' (U + 00A0). – Carsten

+11

Sử dụng '\ p {Z}' hoặc '\ p {Zs}' thay thế. Tôi đã thử nghiệm nó trong Java, và họ làm phù hợp với U + 00A0. –

+1

[\ p {Z} \ s] dường như thực hiện thủ thuật! Cảm ơn! – Carsten

2

  không phải là khoảng trắng. Nó là một chuỗi mã hóa ký tự đại diện cho khoảng trắng trong HTML. Bạn có nhiều khả năng muốn chuyển đổi văn bản được mã hóa HTML thành văn bản thuần tuý trước khi chạy kết hợp chuỗi của bạn với văn bản đó. Nếu đúng như vậy, hãy tìm kiếm javax.swing.text.html

+1

Lol. Có vẻ như Stack Overflow bắt đầu từ ' ' theo nghĩa đen. – Andomar

11

Bạn làm rõ các câu hỏi theo cách như tôi mong đợi: bạn đang thực sự không tìm kiếm các chuỗi literal   càng nhiều ở đây dường như suy nghĩ và giải pháp quá rõ ràng.

Rất tiếc, không có cách nào để đối sánh chúng bằng regex. Tốt nhất là bao gồm các điểm mã cụ thể trong mẫu, ví dụ: "[\\s\\xA0]".

Chỉnh sửa như được bật ra trong một trong các nhận xét, bạn có thể sử dụng undocumented"\\p{Z}" cho việc này. Alan, bạn có thể xin vui lòng để lại bình luận làm thế nào bạn tìm thấy rằng ra? Cái này khá hữu ích.

+3

Đây là một trong số nhiều (hoặc nhiều) thuộc tính tiêu chuẩn Unicode viết tắt. Chúng được đề cập trong tài liệu API mẫu, mặc dù tài liệu này không nằm trong số các ví dụ. Đây là một tổng quan tốt: http://www.regular-expressions.info/unicode.html#prop Nhưng nó không hữu ích vì nó có thể: nó không khớp với các dòng lệnh, các tab hoặc (rõ ràng) bất kỳ khoảng trống ASCII nào khác ngoại trừ không gian (U + 0020). Có lẽ đó là lý do tại sao bạn không bao giờ nghe nói về nó. :) –

+0

Cảm ơn bạn đã xem tổng quan. Tôi thực sự không ngờ rằng những người không có giấy tờ cũng sẽ làm việc trong công cụ regex của Java. Điều đó có nghĩa là tài liệu API không đầy đủ (điều mà tôi thực sự không mong đợi từ những người Sun). – BalusC

+0

Làm phiền rằng '\ s' không khớp với' \ xA0' -______________________- – ThorSummoner

3

Dưới đây là một bản tóm tắt tôi đã thực hiện một số định nghĩa cạnh tranh của "khoảng trắng":

http://spreadsheets.google.com/pub?key=pd8dAQyHbdewRsnE5x5GzKQ

Bạn có thể kết thúc cần phải rõ ràng liệt kê những bổ sung mà bạn quan tâm về điều đó không khớp với một trong các những cái prefab.

+0

Thư viện ổi tham chiếu danh sách này là "so sánh một số định nghĩa của 'khoảng trống'" ([nguồn] (http: //docs.guava-libraries .googlecode.com/git/javadoc/com/google/common/base/CharMatcher.html # WHITESPACE)). Tuy nhiên, Kevin, bạn nên cho đi nguồn của bạn. Ngoài ra, tôi tự hỏi những gì mà dấu hoa thị trên cột "StreamTokenizer; String.trim()" là tốt cho. Và .. char đầu tiên được liệt kê là gì .. "(00-08)"? –

+1

Liên kết đã chết. –

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