我有以下字符串格式的RRULE:
DTSTART;TZID=America/Toronto:20160909T040000RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=MO,WE,FR;UNTIL=20161202T040000
我想将字符串的属性解析为它们各自的变量,以使用表单内部的输入进行更新。相同的RRULE属性将显示在每个字符串中,因此我知道例如DTSTART
将始终在字符串中。
我考虑使用字符串方法search
,通过名称指定属性,然后添加要添加的字符数,以获得实体和所需的位置,然后使用.substring()
例如,如果我试图提取UNTIL
,我可以做:
export const parseUntilFromRRule = (rrule: string):Date => {
const posInRRule = rrule.search("UNTIL=");
const until = rrule.substring(posInRRule + 6);
return new Date(until);
};
然而,对于字符串中间的属性,其中值的长度可能会变化,这种方法不起作用,因为我不知道要传递到substring
的第二个参数的值
我可以使用什么通用技术从字符串中提取每个RRULE属性
我会在这里使用两次字符串拆分:
var input = "DTSTART;TZID=America/Toronto:20160909T040000RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=MO,WE,FR;UNTIL=20161202T040000";
var rrule = input.split("RRULE:")[1].split(";")[0];
console.log(rrule);
您可以用分号分割,然后如果条目包含=
,则用=
分割每个结果,并将结果转换为对象:
const input = `DTSTART;TZID=America/Toronto:20160909T040000RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=MO,WE,FR;UNTIL=20161202T040000`;
const segments = input.split(';');
const entryKeyValues = Object.fromEntries(
segments.map(
segment => segment.includes('=')
? segment.split('=')
: [segment, '']
)
);
console.log(entryKeyValues);
console.log(entryKeyValues.UNTIL);