Извлечение дат из текста

У меня есть такое сообщение с датой Шамси:

Патологоанатомическое заключение от 01.09.1402 г. (22.11.2023 г.): Базально-плоскоклеточный рак кожи правого бедра. Заключение о хирургической патологии от 30.03.1403 г. Множественное поражение лимфоидной ткани метастатической эпителиальной опухолью правой паховой области.

Я хочу извлечь все даты в массив.

Как бы вы это сделали?

Пока что у нас есть это:

const text = `Pathology report on 01.09.1402: Baso-squamous carcinoma in right thigh skin. Surgical pathology report on 30.03.1403, Multiple lymphoid tissue involved by metastatic epithelial tumor of right inguinal mass.`

console.info(getDate(text));

function getDate(d) {
  var day, month, year;

  result = d.match("[0-9]{2}([\-/ \.])[0-9]{2}[\-/ \.][0-9]{4}");
  if (null != result) {
    dateSplitted = result[0].split(result[1]);
    day = dateSplitted[0];
    month = dateSplitted[1];
    year = dateSplitted[2];
  }
  result = d.match("[0-9]{4}([\-/ \.])[0-9]{2}[\-/ \.][0-9]{2}");
  if (null != result) {
    dateSplitted = result[0].split(result[1]);
    day = dateSplitted[2];
    month = dateSplitted[1];
    year = dateSplitted[0];
  }

  if (month > 12) {
    aux = day;
    day = month;
    month = aux;
  }

  return `${day}.${month}.${year}`;
  
  
}
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
56
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Сначала вам нужно иметь реальные даты. 1402 год - неправильный (Шамси) год.

Затем вам нужно зациклиться, чтобы получить их все

function getAllDates(d) {
  let dates = [];
  const regex = /[0-9]{2}([-/ .])[0-9]{2}\1[0-9]{4}/g;
  let match;

  while ((match = regex.exec(d)) !== null) {
    let dateSplitted = match[0].split(match[1]);
    let day = dateSplitted[0];
    let month = dateSplitted[1];
    let year = dateSplitted[2];

    // Swap day and month if necessary
    if (parseInt(month) > 12) {
      let aux = day;
      day = month;
      month = aux;
    }

    dates.push(`${day}.${month}.${year}`);
  }

  return dates;
}

const text = `Pathology report on 01.09.2023: Baso-squamous carcinoma in right thigh skin. Surgical pathology report on 30.03.2023, Multiple lymphoid tissue involved by metastatic epithelial tumor of right inguinal mass.`;

console.info(getAllDates(text));
Ответ принят как подходящий

Поэтому, когда вы хотите извлечь информацию из текста, и она следует определенному шаблону с использованием выражения regex, это имеет смысл.

Итак, я создал массив под названием dates, чтобы использовать его для хранения нужной вам информации, а именно date. Затем я просматриваю документацию по регулярным выражениям, чтобы создать regex_pattern, который соответствует вашему тексту, я назвал его regex не очень хорошее имя, возможно, вам придется его изменить.

regex.exec(interesting_date) используется для поиска каждого date match в предоставленной вами строке. Тогда мы просто return dates:

Я предоставил фрагмент кода, который также учитывает дату и месяц.

const text = `Pathology report on 01.09.1402 (22.11.2023): Baso-squamous carcinoma in right thigh skin. Surgical pathology report on 30.03.1403, Multiple lymphoid tissue involved by metastatic epithelial tumor of right inguinal mass.`;

console.info(getDates(text));

function getDates(interesting_date) {
  const dates = [];
  const regex = /\b\d{2}[-/ .]\d{2}[-/ .]\d{4}\b/g; // Regex to match all date formats

  let match;
  while ((match = regex.exec(interesting_date)) !== null) {
    dates.push(match[0]); // Add each matched date to the array
  }

  return dates;
}

Конечный результат таков:

[ '01.09.1402', '22.11.2023', '30.03.1403' ]

@DarkBee такое ощущение, будто ты меня ругаешь :( в любом случае ты понял

Derek Roberts 13.08.2024 15:44

Что? В этом нет ничего личного. Люди не могут заглянуть вам в голову. Хотя решение может быть ясным для вас, это не означает, что решение ясно для любого будущего читателя, ищущего ответ на этот вопрос.

DarkBee 13.08.2024 15:47

@DarkBee да, капитан, просто поддразниваю тебя, чувак, спасибо, ты прав, IDF справится лучше

Derek Roberts 13.08.2024 15:54

Самый простой способ добиться этого — вызвать String.prototype.match с глобальным (g) совпадением по следующему шаблону: \d{2}\.\d{2}\.\d{4}.

Я отделил извлечение от форматирования, чтобы они не были связаны.

const text = "Pathology report on 01.09.1402 (22.11.2023): Baso-squamous carcinoma in right thigh skin. Surgical pathology report on 30.03.1403, Multiple lymphoid tissue involved by metastatic epithelial tumor of right inguinal mass.";

const extractDates = (textStr) =>
  textStr.match(/\d{2}\.\d{2}\.\d{4}/g).map(dateStr =>
    (([date, month, year]) => new Date(year, month - 1, date))
    (dateStr.split(/\./g)));

// Close to date.toLocaleDateString('de-DE') with explicit padding
const formatDate = (dateObj) => {
  const day = String(dateObj.getDate()).padStart(2, '0');
  const month = String(dateObj.getMonth() + 1).padStart(2, '0');
  const year = dateObj.getFullYear();
  return `${day}.${month}.${year}`;
}

const extractedDates = extractDates(text).map(formatDate);

console.info(extractedDates);

Другие вопросы по теме