Как сделать так, чтобы строка включала ‘:’ между числами, избегая только ‘:’ до или после любого символа java?

#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 ) )?
 

Демонстрация регулярных выражений 2

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

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. Спасибо, но мы можем получить тот же результат, используя гораздо более простое регулярное выражение, что и в моем ответе.