Например, мне нужно проверить следующее предложение диапазона дат: from 10-08-2024 to 12-08-2024
, мне нужно извлечь даты.
Я использовал сайт Regex101 для разработки регулярного выражения и получил следующее:
^(from)\s((?:0[1-9]|[12][0-9]|3[01])-(?:0[1-9]|1[1,2])-(?:19|20)\d{2})\s(to)\s((?:0[1-9]|[12][0-9]|3[01])-(?:0[1-9]|1[1,2])-(?:19|20)\d{2})$
Это работает, однако все возвращаются как группы, а не как совпадения.
как видите, даты начала и окончания возвращаются в виде групп. Единственное совпадение — это целое предложение.
Как я могу получить даты, которые будут возвращены как совпадение 2 и совпадение 3 вместо группы 2 и группы 4 соответственно?
Спасибо Джейме
Какой язык вы используете? (?<=^from\s)(?:(?:0[1-9]|[12][0-9]|3[01])-(?:0[1-9]|1[1,2])-(?:19|20)\d{2})|\s+(?<=to\s)(?:(?:0[1-9]|[12][0-9]|3[01])-(?:0[1-9]|1[1,2])-(?:19|20)\d{2})$
?
Если вы буквально хотите, чтобы эти строки соответствовали отдельным совпадениям, вам нужно создать две разные возможности сопоставления с помощью оператора |
чередования.
Вы можете сделать:
(?<=from\s)((?:0[1-9]|[12][0-9]|3[01])-(?:0[1-9]|1[1,2])-(?:19|20)\d{2})|(?<=to\s)((?:0[1-9]|[12][0-9]|3[01])-(?:0[1-9]|1[1,2])-(?:19|20)\d{2})
Если вам просто нужна более разумная группировка, вы можете сделать:
^(?:from)\s((?:0[1-9]|[12][0-9]|3[01])-(?:0[1-9]|1[1,2])-(?:19|20)\d{2})\s(?:to)\s((?:0[1-9]|[12][0-9]|3[01])-(?:0[1-9]|1[1,2])-(?:19|20)\d{2})$
которые дают вам две группы захвата.
Вы можете использовать обходные пути и удалить группы захвата. Но есть лучший способ сделать это, если у вашего вопроса больше контекста:
(?<=^from\s)(?:0[1-9]|[12][0-9]|3[01])-(?:0[1-9]|1[1,2])-(?:19|20)\d{2}|(?<=\sto\s)(?:0[1-9]|[12][0-9]|3[01])-(?:0[1-9]|1[1,2])-(?:19|20)\d{2}$
Вы «сопоставляете» всю строку, включая «от» и «до». Есть только один матч.
Группы — это фрагменты, которые вы, возможно, захотите извлечь. В зависимости от того, к чему вы собираетесь применить регулярное выражение, вы можете ссылаться на группы, используя обозначения обратной ссылки \2
и \4
, чтобы получить фактические даты.
Вы можете использовать положительный просмотр назад для проверки (от | до), за которым следует предоставленное вами регулярное выражение даты.
(?<=(?:from|to)\s*)(?:(?:0[1-9]|[12][0-9]|3[01])-(?:0[1-9]|1[1,2])-(?:19|20)\d{2})
Здесь вы получаете даты как совпадение 1 и совпадение 2.
Пример источника:
const regex = /(?<=(?:from|to)\s*)(?:(?:0[1-9]|[12][0-9]|3[01])-(?:0[1-9]|1[1,2])-(?:19|20)\d{2})/gm;
const str = `from 10-08-2024 to 12-08-2024`;
let m;
while ((m = regex.exec(str)) !== null) {
m.forEach((match) => {
console.info(match);
});
}
Что-то вроде этого?