#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. ой! Извините … кому-то нужны очки, лол. Благодаря тому, что