2011-02-04 49 views
11

I consider myself khá tốt với Regular Expressions, nhưng điều này đang xuất hiện đáng ngạc nhiên khó khăn: Tôi muốn cắt tất cả khoảng trắng, trừ nhân vật không gian: ' '.Loại bỏ tất cả các ký tự khoảng trắng trừ ""

Trong Java, RegEx tôi đã thử là: [\s-[ ]], nhưng điều này cũng loại bỏ ' '.

UPDATE:

Đây là chuỗi cụ thể mà tôi đang cố gắng dải không gian từ:

project team    manage key

Lưu ý: nó sẽ là những nhân vật giữa "đội" và "quản lý". Chúng xuất hiện dưới dạng không gian dài khi chỉnh sửa bài đăng này nhưng xem dưới dạng một không gian duy nhất trong chế độ xem.

+0

Bạn có thể thay thế tất cả dấu cách bằng ký tự mà bạn biết sẽ không có mặt, xóa tất cả khoảng trắng và thay đổi ký tự đặc biệt trở lại khoảng trắng. –

+0

True (thủ thuật này thực sự đã xảy ra với tôi) và tôi nghi ngờ nó sẽ làm việc nhưng sẽ yêu cầu ba thay thế thay vì một. –

+1

Vì vậy ... uh ... bạn muốn chuỗi đầu ra của bạn đọc 'khóa teammanage dự án '? – CanSpice

Trả lời

20

Hãy thử sử dụng biểu thức chính quy này:

[^\S ]+ 

Đó là một chút bối rối để đọc vì sự tiêu cực kép. Cụm từ thông dụng [\S ] khớp với các ký tự bạn muốn giữ, tức là khoảng trắng hoặc bất kỳ thứ gì không phải là khoảng trắng. Do đó, lớp ký tự phủ định [^\S ] phải khớp với tất cả các ký tự bạn muốn xóa.

+0

Ý tưởng hay, nhưng điều này không thực sự hiệu quả. Điều này có vẻ tương đương về mặt logic với nỗ lực ban đầu của tôi (sử dụng phép trừ). Tôi bắt đầu nghĩ rằng tôi cần phải xác định phạm vi và/hoặc ký tự cụ thể để dải, đó là không may. –

+0

Tôi nên lưu ý rằng nếu tôi thay thế tất cả trên "\ s", nó sẽ loại bỏ tất cả khoảng trống nhưng nó cũng loại bỏ '', quá hung hăng. –

+0

Nó phải hoạt động .... và nó. Hãy thử 'System.out.println (" \ t aaa \ t \ n ".replaceAll (" [^ \\ S] "," ") .getBytes());'. – maaartinus

6

Sử dụng một GuavaCharMatcher:

String text = ... 
String stripped = CharMatcher.WHITESPACE.and(CharMatcher.isNot(' ')) 
    .removeFrom(text); 

Nếu bạn thực sự chỉ muốn rằng tỉa từ khi bắt đầu và kết thúc của chuỗi (như String.trim()) bạn muốn sử dụng trimFrom hơn removeFrom.

+0

Định nghĩa khoảng trắng ở đây khác với định nghĩa được sử dụng bởi \ s. Nó là tốt hơn (gần với tiêu chuẩn Unicode). – maaartinus

3

Không có phép trừ các lớp ký tự trong Java, nếu không bạn có thể sử dụng [\s--[ ]], hãy lưu ý dấu gạch ngang kép. Bạn luôn có thể mô phỏng phép trừ được đặt bằng cách sử dụng giao điểm với phần bổ sung, do đó,

[\s&&[^ ]] 

sẽ hoạt động. Nó không tốt hơn [^\S ]+ từ câu trả lời đầu tiên, nhưng nguyên tắc là khác nhau và nó là tốt để biết cả hai.

+0

Điều này không hoạt động. Tôi khá ngạc nhiên: khi thực hiện một trận đấu trên "\ s" dường như đang xóa nó. –

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