Вставка пробела после запятой, точки и других знаков препинания

#java #regex #string

#java #регулярное выражение #строка

Вопрос:

В Java, каков наилучший способ исправить недостающие пробелы после некоторых знаков препинания, таких как:

 , . ; : ? !
 

Например:

 String example = "This is!just an:example,of a string,that needs?to be fixed.by inserting:a whitespace;after punctuation marks.";
 

Вывод должен быть:

 "This is! just an: example, of a string, that needs? to be fixed. by inserting: a whitespace; after punctuation marks."
 

Понятно, что это не работает:

 example = example.replaceAll("[,.!?;:]", " ");
 

Итак, я ищу решение, ожидающее вашей помощи.
Спасибо!!

Ответ №1:

Вы можете использовать комбинацию Позитивного взгляда назад и Негативного взгляда вперед.

 example = example.replaceAll("(?<=[,.!?;:])(?!$)", " ");
 

Объяснение:

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

 (?<=           # look behind to see if there is:
  [,.!?;:]     #   any character of: ',', '.', '!', '?', ';', ':'
)              # end of look-behind
(?!            # look ahead to see if there is not:
  $            #   before an optional n, and the end of the string
)              # end of look-behind
 

Рабочая демонстрация

Комментарии:

1. Не работает с числом, подобным 1,200 1.200 или ...

Ответ №2:

Вы должны добавить $0 к своему заменяющему выражению, вы можете использовать:

 example = example.replaceAll("[,.!?;:]", "$0 ");
 

Он заменит ваше совпадающее регулярное выражение этим содержимым плюс пробел.

Кстати, если вы хотите убедиться, что у вас нет нескольких пробелов, вы можете сделать:

 example = example.replaceAll("[,.!?;:]", "$0 ").replaceAll("\s ", " "); 
 

Преобразует:

Это!просто:пример строки, которая нужна?чтобы быть fixed.by вставка: пробела; после знаков препинания.;

Для:

Это! просто: пример строки, которая нужна? будет исправлено. путем вставки: пробела; после знаков препинания.

Комментарии:

1. С помощью этого решения я должен удалить возможные двойные пробелы после replaceAll.

2. @MariaH Я отредактировал ответ, чтобы удалить возможные множественные пробелы. Имейте в виду, что этот ответ соответствовал вашим критериям. Если вы хотите попробовать другие критерии, я поддерживаю ответы парней

3. После этого исправления я все равно должен проверять двойные пробелы. Итак, для меня это лучшее и самое простое решение. Спасибо!!

4. @MariaH рад, что тебе понравилось

Ответ №3:

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

решение:

      String example = "This is!just an:example,of a string,that needs?to be fixed.by inserting:a whitespace;after punctuation marks.";
     example = example.replaceAll("(?!\s)\W", "$0 ");
     System.out.println(example);
 

Результат:

 This is! just an: example, of a string, that needs? to be fixed. by inserting: a whitespace; after punctuation marks. 
 

Комментарии:

1. Вам не нужны группы, если вы не собираетесь их использовать

2. @Fede это предварительное утверждение, чтобы предотвратить добавление пустого пространства в другое пространство.

3. ой! Извините … кому-то нужны очки, лол. Благодаря тому, что