replaceAll
использует регулярное выражение в качестве первого параметра, который необходимо найти, а точка .
в регулярном выражении — это метасимвол, который будет соответствовать всем символам, кроме новой строки. Итак, когда вы используете
s = s.replaceAll(".5", "½");
на "1.75"
.5
может соответствовать 75
(поскольку .
соответствует всем). Так что после такого изменения
1.75
-- will become
1.½
(обратите внимание, что 1.25
работает правильно только потому, что вы использовали .25
до .5
)
Чтобы предотвратить такое поведение, вам нужно экранировать точку. Вы можете сделать это по
- поместив
\
перед ним (помните, что для создания литерала \
вам нужно написать его как "\\"
) "\\."
,
- поместите его в класс символов
[.]
,
- окружите его
\Q
и \E
, которые обозначают начало и конец цитаты \\Q.\\E
- окружение с помощью
\Q
и \E
также можно сделать с помощью Pattern.quote(".")
- В случае экземпляра шаблона при компиляции вы можете добавить флаг
Pattern.LITERAL
, чтобы все метасимволы использовались в литералах шаблона.
Если вы хотите, чтобы весь наш шаблон был простым литералом, вы можете использовать replace
вместо replaceAll
, который автоматически использует флаг Pattern.LITERAL
и превращает все метасимволы регулярных выражений в простые литералы.
Итак, вы можете попробовать что-то вроде
return s.replaceAll("\\.25", "¼").replaceAll("\\.5", "½").replaceAll("\\.75", "¾");
или проще
return s.replace(".25", "¼").replace(".5", "½").replace(".75", "¾");
person
Pshemo
schedule
19.12.2013