我如何使用JSON键作为正则表达式

How can I use JSON keys as regex?

本文关键字:正则表达式 JSON 何使用      更新时间:2023-09-26

我想有以下JSON对象:

let emotes = {
  /:-?')/: 'smiley.png',
  /:-?'(/: 'sady.png',
  /:-?o/i: 'surprisey.png'
}

我想用文本中的值替换键,如下所示:

Object.keys(emotes).forEach(function(emote) {
  content = content.replace(emote, '<img src="smileys/' + emotes[emote] + '">')
})

这是不工作。正确的做法是什么?

我个人会使用数组。这允许您使用正则表达式常量,避免从字符串构造正则表达式实例,并且还可以保证应用程序顺序:

let emotes = [
  [ /:-?')/, 'smiley.png' ],
  [ /:-?'(/, 'sady.png' ],
  [ /:-?o/i, 'surprisey.png' ]
];

:

emotes.forEach(function(pair) {
  content = content.replace(pair[0], '<img src="smileys/' + pair[1] + '">');
});

如果您不想要数字索引的丑陋(在我看来是轻微的,但每个人都有自己的),您可以使用对象数组:

let emotes = [
  { pattern: /:-?')/, src: 'smiley.png' },
  { pattern: /:-?'(/, src: 'sady.png' },
  { pattern: /:-?o/i, src: 'surprisey.png' }
];

要清楚,这不是一个JSON对象。它甚至不是合法的JavaScript对象字面量。JS对象的关键字是字符串,而不是正则表达式。你所做的在Firefox AFAICT中是不合法的,可能在其他浏览器中也是。检查你的浏览器日志,它很可能完全拒绝你对emotes的定义。

如果你想要处理一堆对,创建一个对数组并使用它:

let emotes = [
  [/:-?')/, 'smiley.png'],
  [/:-?'(/, 'sady.png'],
  [/:-?o/i, 'surprisey.png'],
]
emotes.forEach(function(emotereplacement) {
    var [emote, replacement] = emotereplacement;
    content = content.replace(emote, '<img src="smileys/' + replacement + '">');
});

您可以将"keys"转换为字符串,这将使其成为有效的JSON对象。同样,语法是Object。

查看下面的工作片段。

let emotes = {
  ":-?)" : 'smiley.png',
  ":-?(": 'sady.png',
  ":-?o": 'surprisey.png'
}
var content = "  :-?)   :-?(  :-?o";
Object.keys(emotes).forEach(function(emote) {
  content = content.replace(emote, '<img src="smileys/' + emotes[emote] + '">')
})
console.log(content);