#java #android #regex #string
#java #Android #регулярное выражение #строка
Вопрос:
Я хочу, чтобы строка была выделена с помощью SpannableString java
У меня есть следующая строка
textString = "2021-01-26 19:23:18 Lat: 26.369919 Long: 83.46433";
Исходя из этого, я могу выделить строку с помощью регулярного выражения с десятичными числами из этого
Pattern regex = Pattern.compile("(\d (?:\.\d )?)");
вот так
textString = «2021-01-26 19:23:18 Широта: 26.369919 Длина: 83.46433«;
Но теперь я хочу создать строку s, включающую также ‘:’ между числами, и хочу избегать ‘:’ до или после любого нечислового символа
Я хочу получить такой вывод
textString = «2021-01-26 19:23:18 Широта: 26.369919 Длина: 83.46433«;
Комментарии:
1. Разве вывод, который вы хотите создать, не совпадает с имеющейся у вас строкой? Я не вижу никакой разницы.
2. 19:23:18 посмотрите на эту строку. Я хочу включить ‘:’ между числами, чтобы мой код избегал этого.
Ответ №1:
Просто включите :
в свой класс символов внутри необязательной группы без захвата и сделайте так, чтобы группа без захвата совпадала 0 или более раз:
\d (?:[:.]\d )*
Демонстрация регулярных выражений
Замена будет:
"<b>$0</b>"
Обратите внимание, что это будет соответствовать числу с несколькими точками, например 83.46433.135
.
Если вы хотите устранить это, используйте:
\d (?:\.\d |(?::\d ) )?
Комментарии:
1. Это действительно скорее вопрос Android, чем чистое регулярное выражение. OP хочет отображать текст жирным шрифтом в своем приложении для Android и хочет использовать spannable string или какую-либо альтернативу этому.
2. Да, это понятно, но какая часть моего ответа несовместима с кодом Java / Android?
3. Я это видел. Вы просто вызываете
.replaceAll
регулярное выражение, чтобы получить числа, завернутые в<b>
и</b>
, и это именно то, что я также показал в своих демонстрационных ссылках.
Ответ №2:
Вы могли бы использовать Html#fromHtml
здесь довольно простой подход:
String textString = "2021-01-26 19:23:18 Lat: 26.369919 Long: 83.46433";
textString = textString.replaceAll("(\d{4})-(\d{2})-(\d{2}) (\d{2}:\d{2}:\d{2})", "<b>$1</b>-<b>$2</b>-<b>$3</b> <b>$4</b>");
textString = textString.replaceAll("(?<!\S)(\d (?:\.\d )?)(?!\S)", "<b>$1</b>");
textView.setText(Html.fromHtml(textString));
Если бы вы регистрировали значение textString
после замены регулярного выражения, вы бы увидели это значение:
<b>2021</b>-<b>01</b>-<b>26</b> <b>19:23:18</b> Lat: <b>26.369919</b> Long: <b>83.46433</b>
Комментарии:
1. В соответствии с желаемыми выводами OP
-
не являются частью выделенного текста.2. @anubhava Хороший глаз… вы читаете более внимательно, чем я. Мне пришлось отредактировать вопрос, чтобы увидеть, где OP на самом деле хочет выделить жирным шрифтом. Мой ответ стал намного уродливее, но я думаю, что сейчас он правильный.
3. Спасибо, но мы можем получить тот же результат, используя гораздо более простое регулярное выражение, что и в моем ответе.