В Java API для регулярных выражений указывается, что \s
соответствует пробелам. Таким образом, регулярное выражение \\s\\s
должно соответствовать двум пробелам.
Pattern whitespace = Pattern.compile("\\s\\s");
matcher = whitespace.matcher(modLine);
while (matcher.find()) matcher.replaceAll(" ");
Цель этого - заменить все экземпляры двух последовательных пробелов одним пробелом. Однако на самом деле это не работает.
Я серьезно неправильно понимаю регулярные выражения или термин «пробел»?
"abc \xA0 def \x85 xyz"
чтобы понять, что я имею в виду: там всего три поля.Ответы:
Да, вам нужно получить результат
matcher.replaceAll()
:источник
Вы не можете использовать
\s
в Java для сопоставления пробелов в собственном наборе символов, потому что Java не поддерживает свойство пробелов Unicode - хотя это строго требуется для соответствия UTS # 18 RL1.2! То, что у него есть, увы, не соответствует стандартам.Unicode определяет 26 кодовых точек как
\p{White_Space}
: 20 из них являются различными видами\pZ
GeneralCategory = Separator , а остальные 6 -\p{Cc}
GeneralCategory = Control .Белое пространство - довольно стабильная собственность, и те же самые существуют практически всегда. Тем не менее, Java не имеет для них свойства, соответствующего стандарту Unicode, поэтому вместо этого вам придется использовать такой код:
Теперь вы можете использовать
whitespace_charclass + "+"
в качестве шаблона в вашемreplaceAll
.Извини за все это. Регулярные выражения Java просто не очень хорошо работают с собственным набором символов, поэтому вам действительно придется прыгать через экзотические обручи, чтобы заставить их работать.
И если вы думаете, что пустое пространство - это плохо, вы должны увидеть, что вам нужно сделать, чтобы получить
\w
и\b
наконец вести себя правильно!Да, это возможно, и да, это ошеломляющий беспорядок. Это даже из благотворительности. Самый простой способ получить соответствующую стандартам библиотеку регулярных выражений для Java - это перейти от JNI к материалам ICU. Это то, что Google делает для Android, потому что OraSun не соответствует требованиям.
Если вы не хотите этого делать, но все же хотите придерживаться Java, у меня есть библиотека для перезаписи внешних регулярных выражений, которую я написал, которая «исправляет» шаблоны Java, по крайней мере, для того, чтобы они соответствовали требованиям RL1.2a в UTS. # 18, Регулярные выражения Юникода .
источник
Для Java (не для php, не для javascript и не для других):
источник
когда я отправил вопрос на форум Regexbuddy (приложение для разработчиков регулярных выражений), я получил более точный ответ на свой вопрос Java:
"Автор сообщения: Ян Гойвертс
В Java сокращения \ s, \ d и \ w включают только символы ASCII. ... Это не ошибка Java, а просто одна из многих вещей, о которых вам нужно знать при работе с регулярными выражениями. Чтобы сопоставить все пробелы Unicode, а также разрывы строк, вы можете использовать [\ s \ p {Z}] в Java. RegexBuddy еще не поддерживает специфичные для Java свойства, такие как \ p {javaSpaceChar} (который соответствует точно таким же символам, как [\ s \ p {Z}]).
... \ s \ s будет соответствовать двум пробелам, если введен только ASCII. Настоящая проблема связана с кодом OP, о чем свидетельствует принятый ответ на этот вопрос ".
источник
[\s\p{z}]
опускает Unicode-символ "следующей строки" U + 0085. Используйте[\s\u0085\p{Z}]
.Кажется, у меня работает:
напечатает:
Я думаю, вы намеревались сделать это вместо своего кода:
источник
Для ваших целей вы можете использовать этот сниппет:
Это нормализует интервал до одиночного, а также удалит начальные и конечные пробелы.
источник
источник
Java эволюционировала с тех пор, как эта проблема была впервые поднята. Вы можете сопоставить все символы пробела Юникода, используя
\p{Zs}
группу.Таким образом, если вы хотите заменить одно или несколько экзотических пространств на простое, вы можете сделать это:
Также стоит знать, если вы использовали
trim()
функцию строки , вы должны взглянуть на (относительно новый)strip()
,stripLeading()
иstripTrailing()
функцию по струнам. Это может помочь вам обрезать всевозможные белые пробелы. Для получения дополнительной информации о том, какое пространство включено, см.Character.isWhitespace()
Функцию Java .источник
Использование пробелов в RE - проблема, но я считаю, что они работают. Проблема OP также может быть решена с помощью StringTokenizer или метода split (). Однако, чтобы использовать RE (раскомментируйте println (), чтобы увидеть, как сопоставитель разбивает строку), вот пример кода:
Он производит следующее (скомпилируйте с помощью javac и запустите из командной строки):
% java Two21WS Начальный: "ab cdef gh ij kl" Two21WS: "ab cdef gh ij kl"
источник
replaceAll()
вместо этого можно просто позвонить ?