javascript - Node JS 中使用捏.js 的子字符串正则表达式

标签 javascript node.js regex

我正在使用 Pinch 库修改 JSON 文件/Javascript 对象:https://github.com/Baggz/Pinch

在此示例中,带有正则表达式参数 /id/pinch() 将所有 id 值修改为 321

我想要做的是能够基于参数 (requestorToChange) 更改所有 id 的值,但仅限于特定的“请求者”。让我们说“RequestorX”。我该如何编写它的正则表达式?

var sample = {
  "RequestorX":
  [{
    user: {
      id: '123'
    },
    request: {
      id: '456'
    },
    book: {
      id: '789'
    }
  }],
  "RequestorY":
  [{
    user: {
      id: '111'
    },
    request: {
      id: '222'
    },
    book: {
      id: '333'
    }
  }]
};

const requestorToChange = 'RequestorX'

pinch(sample, /id/, function(path, key, value) {
  return '321';
});

console.log(JSON.stringify(sample))

我知道一个选择就是这样做:

pinch(sample['RequestorX'], /id/, function(path, key, value) {
  return '321';
});

但我需要能够通过正则表达式字段来完成此操作,因为实际上,我将操作深度嵌套的 JSON 文件。

最佳答案

GitHub 页面上的解释有点稀疏,但基本上你从点符号替换样式开始,用正则表达式模式替换变量部分,同时遵守 JS 正则表达式的规则。

因此,在您的情况下,点表示法模式 'RequestorX[0].user.id'
变成像 /RequestorX\[0\]\.(user|request|book)\.​​id/

这样的正则表达式

一些注释:

  • 首先我们必须转义方括号,因为它们在正则表达式中具有特殊含义
  • 接下来,我们还必须逃避 .将其用作点符号
  • 我们使用一个具有交替的组来替换所有组上的 id
  • 我尝试使用 new RegExp 而不是 /../ 表示法来创建正则表达式对象以将常量添加到模式中,不幸的是只有在这种情况下第一项被替换,可能是一个错误......

    pinch(sample, new RegExp(requestorToChange +'\[0\]\.(user|request|book)\.id'), '321');
    

示例代码(SO代码片段输出一些关于RequestorY的额外乱码,忽略它)

var sample = {
  "RequestorX": [
    {
      "user": {
        "id": "123"
      },
      "request": {
        "id": "456"
      },
      "book": {
        "id": "789"
      }
    }
  ],
  "RequestorY": [
    {
      "user": {
        "id": "123"
      },
      "request": {
        "id": "456"
      },
      "book": {
        "id": "789"
      }
    }
  ]
}

const requestorToChange = 'RequestorX';
//var result = pinch(sample, 'RequestorX[0].user.id', '321'); //replace the user id of RequestorX with dot notation
var result = pinch(sample, /RequestorX\[0\]\.(user|request|book)\.id/, '321');
//var result = pinch(sample, new RegExp(requestorToChange +'\[0\]\.(user|request|book)\.id'), '321');
console.log(JSON.stringify(result));
<script src="https://cdn.jsdelivr.net/npm/pinch@0.1.3/src/pinch.js"></script>

唉,JSON + 正则表达式听起来有点奇怪,但该工具看起来合法。

关于javascript - Node JS 中使用捏.js 的子字符串正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60219808/

相关文章:

javascript - 尝试从 2 个数组中过滤出匹配记录,因为 1 个数组具有不同的结构

javascript - 将选择 ID 和值从 HTML 传递到 JavaScript

node.js - jasmine with gulp,在测试文件上运行测试已更改

javascript - 从 API 获取数据时的客户端与服务器端

python - 拆分器正则表达式取决于它之前的字母

javascript - 内容:encoded: in JSON with JQuery

javascript - Nightwatchjs获取多个输入的值

javascript - 循环内的 promise

php - PHP正则表达式匹配首次出现?

regex - 如何在 SMLNJ 中使用正则表达式