2015-02-03 12 views
20

mam wprowadzisz plik wejściowy które trzeba przetworzyć i wyrzucić wszystkie biało-przestrzenie, w tym non-breaking space U+00A0 aka   (Można produkować go w Notatniku naciskając Alt a następnie wpisując z klawiatury numerycznej.) Lub dowolnej innej formy białej przestrzeni. Próbowałem już String.trim(), ale nie przycina ona U+00A0.Jak przyciąć brak przerw w Javie?

Czy muszę jawnie sprawdzić dla U+00A0, a następnie trim(), czy istnieje prosty sposób przycinania wszystkich białych znaków w Javie?

+0

co z "Ciągiem" zastępują warianty? –

+2

Kiedy mówisz "wszystko", masz na myśli * wszystkie *? – ChiefTwoPencils

+0

tak, wymienić działa. :) Nie myślałem o tym wcześniej: | Jaka jest różnica między "wszystkimi" i "wszystkimi"? – Abhishek

Odpowiedz

27

Podczas   jest non breaking space (przestrzeń, która nie chce być traktowany jako spacji) możesz przyciąć ciąg, zachowując każdy   w ciągu znaków, korzystając z prostego wyrażenia regularnego:

string.replaceAll("(^\\h*)|(\\h*$)","") 
  • \h to poziomy biały znak: [ \t\xA0\u1680\u180e\u2000-\u200a\u202f\u205f\u3000]

Jeśli używasz wersji pre JDK8, trzeba jawnie użyć listę znaków zamiast \h.

+0

To jest najczystsze i najbardziej ogólne rozwiązanie do tej pory. Warto wspomnieć, że '\ h' jest dostępne tylko od wersji Java 8, ale we wcześniejszych wersjach można użyć jawnego zakresu podanego w odpowiedzi. – 5gon12eder

+0

To genialne! Dokładnie jeden liniowiec, który zajmie się wszystkimi rodzajami przestrzeni. – Abhishek

+0

Jedną z rzeczy, które mogą być pomocne, jest to, że mają one klasyfikację Unicode separatora przestrzeni. Podoba mi się ta strona jako odniesienie do zawartości, ponieważ oficjalny materiał Unicode jest nieco suchy: [Space Separators] (http://www.fontspace.com/unicode/category/space-separator) – Steve

15

U+0160 nie jest białą przestrzenią, więc nie zostanie przycięty. Ale możesz po prostu replace(), że znaki z spacji, a następnie zadzwoń trim(), więc zachować spacje, które są "wewnątrz" ciąg znaków.

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

Istnieje three non-breaking whitespace znaki, które są wyłączone z metodą Character.isWhitespace(): \u00A0, \u2007 i \u202F, więc prawdopodobnie chcesz, aby zastąpić te zbyt.

+0

Zadziałało !! Dzięki :) Zakładam, że muszę obsługiwać wszystkie białe znaki (http://en.wikipedia.org/wiki/Whitespace_character) jawnie i jeden po drugim, prawda? – Abhishek

+0

'trim()' zajmie się wszystkimi znakami, które są wymienione jako białe znaki java, więc nie musisz dodawać wszystkich znaków białych znaków. Zobacz tutaj: http://docs.oracle.com/javase/8/docs/api/java/lang/Character.html#isWhitespace-char- – RobAu

1

Jeśli używasz Apache Commons Lang, możesz użyć strip i dodać wszystkie potrzebne znaki.

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."