Вы могли бы попробовать с
yourString = yourString.replaceAll("(\\*{2})|\\*","$1");
Объяснение: replaceAll
использует регулярные механизмы (регулярное выражение) выражение. Также *
является специальным символом в регулярном выражении, поэтому нам нужно его избежать (я использовал \\*
, чтобы сделать это, но вы также можете использовать [*]
или окружить его \\Q
\\E
). Теперь давайте посмотрим, что это регулярное выражение:
(\\*{2})
- будет пытаться соответствовать **
и поместить его в 1-й группе
|
- ИЛИ оператора
\\*
- матч только один *
Так это решение попытается сначала найти **
, сохранить его в группе 1, а затем заменить его совпадением с группой 1 (поэтому мы заменяем его самим, что означает, что они останутся в тексте).
Но если regex engine не сможет найти **
и вместо этого найдет *
, группа 1 будет пуста, так как она может совпадать только с двумя звездами (так как эта часть регулярного выражения окружена скобками). Поэтому наша замена $1
будет представлять пустую строку, что означает, что мы удалим сингл *
.
Так текущее решение вызовет следующие изменения:
* -> - found 1 star (remove it)
** -> ** - found 2 stars (stay)
*** -> ** - found 2 stars (stay), 1 star (remove)
**** -> **** - found 2 stars (stay), 2 stars (stay)
***** -> **** - found 2 stars (stay), 2 stars (stay) and 1 star (remove)
Если вы не хотите, чтобы повлиять на 2 или больше звезд (как ***
все равно должен быть ***
) вместо {2}
использования {2,}
, это будет позволяют нам хранить в группе 1 две или более звезд (но не одного).
Должны ли мы рассматривать ввод с 3 звездами? Если да, то как бы вы хотели справиться с ними? – Pshemo
@Pshemo 3 звезды не нужно учитывать, но ответ Стробижева, похоже, работает во всех случаях. – silverAndroid