【问题标题】:JS Regex named groups with replace()带有替换()的JS正则表达式命名组
【发布时间】:2021-08-19 16:18:24
【问题描述】:

在 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 变量中选择字符,从 ":" 到 "," 并将其替换为 formatters 值。然后把字符串变成一个对象。

【问题讨论】:

  • 映射推定键的逻辑不明确。你怎么知道'rounded-tr' 中的首字母(或尾随的)'r' 不应该转换为 '-right'
  • 如何使用 replace() 将 expectedOutput 作为对象?
  • 叶夫根:啊,这是个问题。也许将每个可替换字符包装在 '[ ]' 中?像这样:rounded-tr:[d][t][r]-radius?
  • @stackminu: 不是很优雅,但这可能会起作用(如果你不应该在输出中既没有'[',也没有']',并且你完全可以控制传入的内容作为str)。
  • User863:这很简单,可以使用mapjoin。在弄清楚正则表达式部分后将进行演示。

标签: javascript php css arrays regex


【解决方案1】:

Regex Demo

\[([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)

【讨论】:

    猜你喜欢
    • 2016-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-11
    • 1970-01-01
    • 2012-08-26
    • 2012-01-04
    • 2018-11-09
    相关资源
    最近更新 更多