#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: не очень элегантно, но это может сработать (если вы не должны иметь ни
'['
того , ни']'
другого в своем выводе и полностью контролировать то, что передается как astr
).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)