2011-02-04 2 views
11

Я считаю себя довольно хорошо с регулярными выражениями, но это один появляется на удивление сложно: я хочу, чтобы обрезать все пропуски, за исключением пространство символов: ' '.Удаление всех пробельных символов за исключением «»

В Java, RegEx, я пробовал: [\s-[ ]], но этот также удаляет ' '.

UPDATE:

Вот конкретная строка, что я пытаюсь лишить пространства от:

project team    manage key

Примечание: было бы символы между «командой» и «управление». Они отображаются как длинное пространство при редактировании этого сообщения, но рассматриваются как одно пространство в режиме просмотра.

+0

Вы можете заменить все пробелы символом, который, как вы знаете, не будет присутствовать, удалить все пробелы и сменить специальный символ на пробел. –

+0

True (этот трюк на самом деле уже произошел со мной), и я подозреваю, что это сработает, но потребует замены вместо трех. –

+1

Итак ... э-э ... вы бы хотели, чтобы ваша строка вывода читала «командный ключ команды проекта»? – CanSpice

ответ

20

Попробуйте использовать это регулярное выражение:

[^\S ]+ 

Это немного сбивает с толку, чтобы читать из-за двойного негатива. Регулярное выражение [\S ] соответствует символам, которые вы хотите сохранить, т. Е. Пробелу или чему-либо, что не является пробелом. Таким образом, отрицательный класс символов [^\S ] должен соответствовать всем символам, которые вы хотите удалить.

+0

Хорошая мысль, но это на самом деле не работало. Это кажется логически эквивалентным моей первоначальной попытке (которая использует вычитание). Я начинаю думать, что мне нужно указывать диапазоны и/или конкретные символы для полоски, что является неудачным. –

+0

Я должен отметить, что если я все-таки заменил на «\ s», он удалит все пробелы, но также удалит «', что является слишком агрессивным. –

+0

Он должен работать ... и он делает. Попробуйте 'System.out.println (" \ t aaa \ t \ n ".replaceAll (" [^ \\ S] "," ") .getBytes());'. – maaartinus

6

Использование GuavaCharMatcher:

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

Если вы на самом деле просто хотите, чтобы обрезанная с самого начала и конца строки (как String.trim()) вы будете использовать trimFrom вместо removeFrom.

+0

Определение пробела здесь отличается от определения, используемого \ s. Это лучше (ближе к стандарту Unicode). – maaartinus

3

В Java нет вычитания классов символов, иначе вы могли бы использовать [\s--[ ]], обратите внимание на двойную тире. Вы всегда можете моделировать вычитание множества с помощью пересечения с дополнением, поэтому

[\s&&[^ ]] 

должно работать. Это не лучше, чем [^\S ]+ с первого ответа, но принцип отличается, и хорошо знать оба.

+0

Это тоже не работает. Я довольно удивлен: так как выполнение матча на «\ s», похоже, удаляет его. –

Смежные вопросы