Node.js/Javascriptメモ-正規表現を使った固定長文字列分解

タイトルの通りメモ

一般的なやり方
const message = "20230302101112tyokyo     ";
const obj {
    YYYY:  str.slice(0, 4),    MM:  str.slice(4, 6),    DD:  str.slice(6, 8),
    hh:  str.slice(8, 10),    mm:  str.slice(10, 12),    ss:  str.slice(12, 14),
    area:  str.slice(14, 25),
}
console.dir(obj);

なんというかやぼったい

正規表現を使ったやり方
const message = "20230302101112tyokyo     ";
const obj = str.match(/(?<YYYY>.{4})(?<MM>.{2})(?<DD>.{2})(?<hh>.{2})(?<mm>.{2})(?<ss>.{2})(?<area>.{10})/);
console.dir(obj.groups);

結果

[Object: null prototpe] {
    YYYY: '2023',
    MM: '03',
    DD: '02',
    hh: '10',
    mm: '11',
    ss: '12',
    area: '12',
}

仕組み
正規表現のグループ化をつかってマッチする位置にある文字列を抽出してオブジェクト化する
位置を指定するので固定長にのみ有効

正規表現の部分を見やすくするとした以下のようにすると読みやすくなる(処理速度は落ちる)

const message = "20230302101112tyokyo     ";
const regexpTextArray = [
    '(?<YYYY>.{4})',    '(?<MM>.{2})',    '(?<DD>.{2})', 
    '(?<hh>.{2})',    '(?<mm>.{2})',    '(?<ss>.{2})',
    '(?<area>.{10})'
];
const obj = str.match(new RegExp(regexpTextArray .join('')));
console.dir(obj.groups);