Регулярное выражение Java для соответствия _все_ пробельных символов - PullRequest
30 голосов
/ 01 декабря 2009

Я ищу регулярное выражение в Java, которое соответствует всем пробельным символам в строке. «\ s» соответствует только некоторым, оно не соответствует   и аналогичным пробелам, отличным от ascii. Я ищу регулярное выражение, которое соответствует всем (общим) символам пробела, которые могут встречаться в строке Java.

[Изменить]

Чтобы уточнить: я не имею в виду последовательность строк " ", я имею в виду символ unicode синкодера U + 00A0, который часто представлен как " ", например, в HTML и во всех других символах Юникода с похожим символом пробела, например "NARROW NO-BREAK SPACE" (U + 202F), Word joiner, закодированный в Unicode 3.2 и выше как U + 2060, "ZERO WIDTH NO-BREAK SPACE" (U + FEFF) и любой другой символ, который можно считать белым пространство.

[Ответ]

Для моей цели, то есть перехвата всех пробельных символов, Unicode + традиционное, следующее выражение делает работу:

[\p{Z}\s]

Ответ содержится в комментариях ниже, но поскольку он немного скрыт, я повторяю его здесь.

Ответы [ 7 ]

36 голосов
/ 01 декабря 2009

& NBSP; не является пробельным символом, насколько это касается регулярных выражений. Вам нужно либо изменить регулярное выражение, чтобы включить эти строки в дополнение к \ s, например / (\ s | & nbsp; |% 20) /, либо предварительно проанализировать содержимое строки, чтобы получить представление данных в формате ASCII или Unicode.

Здесь вы смешиваете уровни абстракции.

Если то, что после тщательного перечитывания вопроса, кажется, имеет место, вы выбираете способ сопоставления всех пробельных символов, относящихся к стандартному ASCII, плюс кодовые точки пробела, \p{Z} или \p{Zs} выполнят эту работу.

Вы должны действительно уточнить свой вопрос, потому что он ввел в заблуждение многих людей (даже делая правильный ответ, чтобы иметь некоторые отрицательные голоса).

11 голосов
/ 01 декабря 2009

Вы разъяснили вопрос так, как я и ожидал: вы на самом деле не ищете строковый литерал  , как многие здесь думают, и для которого решение слишком очевидно.

Ну, к сожалению, нет способа сопоставить их с помощью регулярных выражений. Лучше всего включить конкретные кодовые точки в шаблон, например: "[\\s\\xA0]".

Редактировать Как выяснилось в одном из комментариев, вы можете использовать для этого недокументированный 1010 "\\p{Z}". Алан, можешь оставить комментарий, как ты это узнал? Этот весьма полезен.

11 голосов
/ 01 декабря 2009

  - это только пробел в HTML. Используйте HTML-парсер для извлечения простого текста. и \s должно работать просто отлично.

3 голосов
/ 02 декабря 2009

Вот резюме, которое я сделал из нескольких конкурирующих определений «пробела»:

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

Возможно, вам придется в явном виде перечислить дополнительные, которые вам не безразличны, которые не соответствуют ни одному из готовых.

2 голосов
/ 21 июля 2017

Если кто-то снова столкнется с этим вопросом в поисках помощи, я предлагаю следующий ответ: https://stackoverflow.com/a/6255512/1678392

Краткая версия: \\p{javaSpaceChar}

Почему: согласно классу паттернов это сопоставляет метод Character.isSpaceChar :

Категории, которые ведут себя как логическое значение java.lang.Character: имя метода методы (кроме устаревших) доступны через тот же синтаксис \ p { prop }, где указан свойство имеет имя java methodname .

?

2 голосов
/ 01 декабря 2009

  не является пробелом. Это последовательность кодирования символов, представляющая пробел в HTML. Скорее всего, вы захотите преобразовать кодированный в HTML текст в простой текст перед выполнением сопоставления строк. Если это так, посмотрите вверх javax.swing.text.html

0 голосов
/ 01 декабря 2009

Символы регулярного выражения являются единственными, независимыми от кодировки. Вот список некоторых символов, которые - в Юникоде - не печатаются:

Сколько непечатных символов обычно используется?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...