Ernesto
@Ernesto
Junior

Как найти последний элемент времени в строке и добавить произвольный текст?

Нужно найти в тексте время и после последнего найденного элемента в скобках добавлять (время местное).
Код ниже работает исправно ровно до тех пор, пока не встречается одинаковое время. В этом случае вставляет после первого найденного...

const originalString = " с 14:01 к 15:00 работать по плановому";
  const appendText = " (время местное)";

  const timeRegex = /\b\d{1,2}:\d{2}\b/g;
  const matches = originalString.match(timeRegex);

  if (matches) {
    const lastTime = matches[matches.length - 1];
    const updatedString = originalString.replace(new RegExp(`\\b${ lastTime }\\b`), lastTime + appendText);

    console.log(updatedString); 
    return updatedString
  } else {
    console.log("No time found");
    return originalString
  }
  • Вопрос задан
  • 153 просмотра
Решения вопроса 1
Alexandroppolus
@Alexandroppolus
кодир
const addTimeDescription = (str) =>
    str.replace(/\b\d{1,2}:\d{2}\b(?!.*?\b\d{1,2}:\d{2}\b)/, '$& (время местное)');

// пример использования

const originalString = " с 14:01 к 15:00 работать по плановому";
const updatedString = addTimeDescription(originalString); // ' с 14:01 к 15:00 (время местное) работать по плановому'


здесь берем только то совпадение, после которого нет другого совпадения.

самый интересный момент - ".*?" вместо ".*", благодаря этому регулярка на порядки быстрее работает на длинных строках с кучей отметок времени

update: более простая регулярка, на основе жадности:
/^.*\b\d\d?:\d\d\b/
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
alexey-m-ukolov
@alexey-m-ukolov Куратор тега JavaScript
- .replace(new RegExp(`\\b${ lastTime }\\b`)
+ .replaceAll(new RegExp(`\\b${ lastTime }\\b`, `g`)


Но тут надо понимать, чего вообще вы ожидаете. Например, для строки "плановые подвиги в 12:19, 13:59 и 14:00, ужин в 14:00" обе версии кода вернут "плановые подвиги в 12:19, 13:59 и 14:00, ужин в 20:00 (время местное)", а вот для "плановые подвиги в 12:19, 13:59 и 14:00, обед в 14:00" ваша версия вернёт "плановые подвиги в 12:19, 13:59 и 14:00 (время местное), обед в 14:00", а моя - "плановые подвиги в 12:19, 13:59 и 14:00 (время местное), обед в 14:00 (время местное)".
Может, должно заменяться только в принципе последнее значение времени (т.е. "плановые подвиги в 12:19, 13:59 и 14:00, обед в 14:00 (время местное)")?
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
const str = 'с 14:01 к 15:00 работать по плановому';
console.log(str.replace(/(\d\d:\d\d)(?!.*\d\d:\d\d)/, (s) => s + ' (время местное)'));
// с 14:01 к 15:00 (время местное) работать по плановому
Ответ написан
Комментировать
copyhold
@copyhold
...
if (matches) {
const updatedString = originalString.split(lastTime).toSpliced(-1,0,appendText).join(lastTime);
...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы