У меня есть такое сообщение с датой Шамси:
Патологоанатомическое заключение от 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}`;
}
Сначала вам нужно иметь реальные даты. 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 да, капитан, просто поддразниваю тебя, чувак, спасибо, ты прав, IDF справится лучше
Самый простой способ добиться этого — вызвать 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);
@DarkBee такое ощущение, будто ты меня ругаешь :( в любом случае ты понял