在字符串中的已知字符后查找变量子字符串

Find variable substring after known characters inside a string

我有以下字符串格式的 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[=17 的第二个参数的值=]

我可以使用什么通用技术从字符串中提取每个 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);

我会在这里使用字符串拆分两次:

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);