Регулярное выражение Java для замены отдельных букв пробелами с обеих сторон пробелами - PullRequest
2 голосов
/ 09 марта 2011

Может кто-нибудь помочь мне с регулярным выражением заменить все отдельные буквы пробелами.Пример:

 input: "this is a t f with u f array"
output: "this is       with     array".

мое регулярное выражение replaceAll("(\\s+[a-z]\\s+)"," "); Но оно работает следующим образом:

  input: "this is a t f with u f array"
 output: "this is   t f with   f array".

Ответы [ 7 ]

6 голосов
/ 09 марта 2011

Проблема возникает из-за того, как replaceAll работает. То, что происходит, происходит после того, как каждый раз, когда он заменяет раздел, он начинает смотреть после раздела, которому он соответствует, например, когда ваш шаблон запускается, вы получаете результат

this is t with f array

То, что происходит внутри, это:

  1. сопоставить шаблон с "это массив с u"
  2. совпадение найдено в "t"
  3. заменить на "".
  4. Начать сопоставление после последнего сопоставления ("f with u f array")
  5. Примечание. "F" не соответствует, потому что нет начального пробела.

То, что вам нужно, - это трюк, называемый «положительный прогноз нулевой ширины». Если вы используете шаблон:

(\\s+[a-z](?=\\s))

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

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

"this is a t f with u f array".replaceAll("(\\s+[a-z](?=\\s))","")
2 голосов
/ 09 марта 2011

Вы можете попробовать слово Границы :

"this is a t f with u f array".replaceAll("\\b[a-z]\\b"," ")
0 голосов
/ 09 марта 2011

Строка a = "это atf с массивом uf";

a = a.replaceAll ("(\ s \ p {Alpha} (? = \ S)) + ((? = \ S) \ s) "," ");

Позитивный прогноз с нулевой шириной, сопровождаемый соответствием завершающего пробела в группе захвата, дает то, что вы ищете:

это с массивом

0 голосов
/ 09 марта 2011

Вы можете использовать границу слова: -

    String s = "this is a t f with u f array";
    s = s.replaceAll("\\b\\w\\b\\s+", "");
    System.out.println(s); // this is with array
0 голосов
/ 09 марта 2011

replaceAll("\\b[a-z]\\b", " ");

выдаст

this is       with     array

Проблема в том, как replaceAll подходит к вещам. \\s[a-z]\\s совпадений

"а"

затем переходит к

"t f with u f array"

что заставляет его пропустить первый t

0 голосов
/ 09 марта 2011

Этот работает на вашем тесте:

(\s+[a-z](\s[a-z])*\s+)
0 голосов
/ 09 марта 2011

Хм ... возможно потому, что когда "a" найден и заменен на "... atf ..", средство сравнения смотрит на следующий символ, который равен 't' (пространство уже используется)Но с другой стороны, я бы ожидал, что результат будет "это t с массивом f".

Попробуйте вместо этого использовать replaceAll("((\s+[a-z])*\s+)"," ").Но у него есть (нежелательный?) Побочный эффект, что любая длина пробела будет уменьшена до одного пробела.

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