我有用戶提供的日期和該日期的格式。(dmyyyy 和 15.10.2021 用于此示例)
const format = dateFormat || 'yyyy-mm-dd';
從該格式中,我需要獲取年、月和日的位置,以便我可以在日期上使用該位置。
const year = /y{4}|y{2}/.exec(format);
const month = /m{1,2}/.exec(format);
const day = /d{1,2}/.exec(format);
到目前為止一切正常,但是當我嘗試從日期中獲取年份的位置時:
const yearVal = date.substring(year.index, year.index year[0].length);
year.index當它應該是 6 時是 4。所以,而不是2021,我得到0.20它就像index不包括點,但這怎么會有任何意義!?
這就是我的想法:在 Javascript 中回傳正則運算式 match() 的位置?
是我用index錯了,還是這有什么問題?
編輯:有些人理解格式“dmyyyy”是一個錯字,或者意味著只有一個數字。我理解這種困惑,所以讓我們澄清一下。像Luxon或node-dateformat這樣的庫定義了“d”和“dd”之間的區別,如下所示:
"d" 以數字表示的月份中的第幾天;個位數天數沒有前導零。
"dd" 以數字表示的月份中的第幾天;個位數天數前導零。
uj5u.com熱心網友回復:
你可以從這樣的模式中生成一個正則運算式:
format.replace(/([ymd])\1*/g, (match, ymd) => `(?<${ymd}>${'\\d'.repeat(match.length)})`);
yyyy-mm-dd將變為/(<?y>\d\d\d\d)-(<?m>\d\d)-(<?d>\d\d)/,然后您可以使用組名提取年/月/日:
function getDates(format, date) {
const regex = new RegExp(format.replace(/(\w)\1 |(\w)/g, ({length}, w, s) => `(?<${w||s}>${s ? '\\d ' : '\\d'.repeat(length)})`));
const result = date.match(regex);
if(result) {
const { y: year, m: month, d: day } = result.groups;
return { year, month, day };
}
}
console.log(getDates('yyyy-mm-dd', '2021-10-15'));
console.log(getDates('dd/mm/yyyy', '15/10/2021'));
console.log(getDates('mm-dd-yy', '10-15-21'));
console.log('----');
console.log(getDates('yyyy-m-d', '2021-9-15'));
console.log(getDates('yyyy-m-d', '2021-10-6'));
uj5u.com熱心網友回復:
這里的另一個選項是拆分格式和值,在相應的索引處查找 y/m/d
const lookup = ( format, value ) => {
const f = format.split(/(m |d |y )/).filter(Boolean);
const v = value.split(/(\D )/).filter(Boolean);
return [
v[f.findIndex(i => i.startsWith('y'))],
v[f.findIndex(i => i.startsWith('m'))],
v[f.findIndex(i => i.startsWith('d'))]
];
}
console.log(lookup('d.m.yyyy', '10.5.2021'));
console.log(lookup('d.m.yyyy', '10.12.2021'));
console.log(lookup('dd.mm.yyyy', '10.05.2021'));
uj5u.com熱心網友回復:
這是不聰明的解決方案。您無法輕松地為此添加小時和分鐘。但至少它有效。
function dateFromString(date, dateFormat) {
const format = dateFormat || 'yyyy-mm-dd';
let parts = date.match(/(\d )/g); // get all groups of numbers
// parse format
const year = /y{4}|y{2}/.exec(format).index;
const month = /m{1,2}/.exec(format).index;
const day = /d{1,2}/.exec(format).index;
// order the parts
if (year > month) {
if (month > day) {
parts = parts.reverse();
} else if (day > year) {
[parts[0], parts[1]] = [parts[1], parts[0]];
} else {
[parts[0], parts[1], parts[2]] = [parts[2], parts[0], parts[1]];
}
} else if (month > day) {
if (day > year) {
[parts[1], parts[2]] = [parts[2], parts[1]];
} else {
[parts[0], parts[1], parts[2]] = [parts[1], parts[2], parts[0]];
}
}
// make sure year is a full year
if (parts[0].length < 4) {
parts[0] = "20" parts[0];
}
return new Date(parts[0], parts[1] - 1, parts[2], 0, 0, 0, 0);
}
console.log(dateFromString("15.10.21", "d.m.yy").toString());
console.log(dateFromString("10/15/2021", "mm/dd/yyyy").toString());
console.log(dateFromString("2021-10-15", "yyyy-mm-dd").toString());
console.log(dateFromString("15@2021#10", "dd@yyyy#mm").toString());
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/316076.html
標籤:javascript 正则表达式
上一篇:從R資料框中的字符列中提取%
