2011-02-04 15 views
11

uważam się dość dobrze z wyrażeń regularnych, ale ten pojawia się zaskakująco trudne: Chcę, aby przyciąć wszystkie spacje, wyjątkiem spacja: ' '.Usuwanie wszystkich znaków białych znaków z wyjątkiem „”

W języku Java, RegEx, którego próbowałem, to: [\s-[ ]], ale ten również usuwa ' '.

UPDATE:

Oto konkretny ciąg znaków, który ja próbuje rozebrać obowiązuje od:

project team    manage key

Uwaga: byłoby znaki między "zespół" i "zarządzanie". Pojawiają się jako długie spacje podczas edytowania tego wpisu, ale są wyświetlane jako pojedyncze spacje w trybie przeglądania.

+0

Możesz zastąpić wszystkie spacje znakiem, który nie będzie obecny, usunąć wszystkie spacje i zmienić znak specjalny z powrotem na spację. –

+0

To prawda (ta sztuczka faktycznie już przyszła mi do głowy) i podejrzewam, że to zadziała, ale wymagałoby trzech zamienników zamiast jednego. –

+1

Więc ... uh ... chciałbyś, aby twój ciąg wyjściowy odczytał 'klucz zarządzania zespołem projektu'? – CanSpice

Odpowiedz

20

Spróbuj użyć tego wyrażenia regularnego:

[^\S ]+ 

To trochę mylące, aby odczytać z powodu podwójnego ujemny. Wyrażenie regularne [\S ] dopasowuje znaki, które chcesz zachować, tj. Albo spację, albo cokolwiek, co nie jest białym znakiem. Zanegowana klasa znaków [^\S ] musi więc pasować do wszystkich znaków, które chcesz usunąć.

+0

Dobra myśl, ale to się nie udało. Wydaje się to logicznie równoważne mojej pierwotnej próbie (która używa odejmowania). Zaczynam myśleć, że muszę określić zakresy i/lub konkretne znaki do usunięcia, co jest niefortunne. –

+0

Należy zauważyć, że jeśli zrobię zamień wszystko na "\ s" to usuwa wszystkie białe znaki, ale również usuwa "", który jest zbyt agresywny. –

+0

To musi działać .... i tak. Wypróbuj 'System.out.println (" \ t aaa \ t \ n ".replaceAll (" [^ \\ S] "," ") .getBytes());'. – maaartinus

6

Używanie GuavaCharMatcher:

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

Jeśli faktycznie po prostu, że przycięta od początku i na końcu łańcucha (jak String.trim()), który by użyć trimFrom zamiast removeFrom.

+0

Definicja białych znaków różni się od tej używanej przez \ s. Jest lepiej (bliżej standardu Unicode). – maaartinus

3

W języku Java nie ma odejmowania klas znaków, w przeciwnym razie można użyć wartości [\s--[ ]], należy zwrócić uwagę na podwójną myślnik. Możesz zawsze symulować odejmowanie zestawu za pomocą przecięcia z dopełnieniem, więc powinno działać. To nie jest lepsze niż [^\S ]+ od pierwszej odpowiedzi, ale zasada jest inna i dobrze jest znać obie.

+0

To też nie działa. Jestem raczej zaskoczony: jako że dopasowanie na "\ s" zdaje się go usuwać. –

Powiązane problemy