Поиск переменной подстроки после известных символов внутри строки

#javascript #typescript #rrule

#javascript #typescript #rrule

Вопрос:

У меня есть следующее правило в строковом формате:

 DTSTART;TZID=America/Toronto:20160909T040000RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=MO,WE,FR;UNTIL=20161202T040000
  

Я хочу разобрать свойства строки в их собственные соответствующие переменные, чтобы использовать входные данные внутри формы для обновления. Одни и те же свойства RRULE будут отображаться в каждой строке, поэтому я знаю, например, что DTSTART это всегда будет в строке.

Я думал об использовании метода string search , указав свойство по его имени, а затем добавив количество символов для добавления, чтобы получить позицию объекта и want, а затем использовать .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 из строки?

Ответ №1:

Я бы использовал здесь разделение строки дважды:

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

Ответ №2:

Вы можете разделить на точки с запятой, затем разделить каждый результат на = , если запись содержит a = , и превратить результат в объект:

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

Комментарии:

1. Не полное решение, но это избавит меня от необходимости писать несколько дополнительных утилит! Я могу использовать это для свойств, для которых оно работало, и использовать принятый ответ для FREQ и DTSTART