Регулярное выражение JS именованные группы с заменой()

#javascript #php #css #arrays #regex

Вопрос:

В JS я пытаюсь создать объект из приведенного ниже кода. Однако я застрял в получении регулярных выражений именованных групп с помощью приведенной ниже функции замены.

 var formatters = {
    'p': 'padding',
    'm': 'margin',
    'd': 'border',  // Had to use letter "d", Becuase "b" means "bottom".
    't': '-top',
    'b': '-bottom',
    'l': '-left',
    'r': '-right'
}

var str = 'p:[p], pt:[p][t], pb:[p][b], rounded-tr:[d][t][r]-radius'

var match = str.replace(/:(?<selection>.*?)(:?,)/g, (m) => formatters[m])

// var expectedOutput = {'p':'padding', 'pt':'padding-top', 'pb':'padding-bottom', 'rounded-tr': 'border-top-right-radius'}

 

ПРИМЕЧАНИЕ: То, что я пытаюсь сделать, это выбрать символы из переменной str от «:» до», » и заменить их значениями форматеров. Затем сделайте строку объектом.

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

1. Логика сопоставления предполагаемых ключей неоднозначна. Откуда вы знаете, что начальный (или конечный, если на то пошло) 'r' в 'rounded-tr' не должен быть преобразован в '-right' ?

2. Как вы могли бы стать expectedOutput похожим на объект, используя replace()?

3. Евгений: Ах, вот в чем проблема. Может быть, обернуть каждый заменяемый символ в ‘[ ]’ ? Вот так: rounded-tr:[d][t][r]-radius ?

4. @stackminu: не очень элегантно, но это может сработать (если вы не должны иметь ни '[' того , ни ']' другого в своем выводе и полностью контролировать то, что передается как a str ).

5. Пользователь863: Это просто, можно обойтись map и join . Продемонстрирует после выяснения части регулярного выражения.

Ответ №1:

Демонстрация регулярных выражений

 [([a-z])]
 
 var formatters = {
  'p': 'padding',
  'm': 'margin',
  'd': 'border', // Had to use letter "d", Becuase "b" means "bottom".
  't': '-top',
  'b': '-bottom',
  'l': '-left',
  'r': '-right'
}

var str = 'p:[p], pt:[p][t], pb:[p][b], rounded-tr:[d][t][r]-radius'

var match = str.replace(/[([a-z])]/g, (m, p1) => formatters[p1])

console.log(match)

var expectedOutput = Object.fromEntries(match.split(', ').map(s => s.split(':')))

console.log(expectedOutput)