用正则表达式nodejs替换变化的字符串

时间:2019-04-02 06:15:33

标签: javascript node.js regex

我需要在一个很大的字符串中识别类似于以下内容的模式,并将其替换为“ null”:

["pmeta", ["ImageSelectStoreFront", null, 3, 4, 2, null, "Storefront", []]], ["pmeta", ["/m/01pns0", null, 3, 3, 3, null, "fire hydrant", []], null, [1]], ["pmeta", ["/m/0199g", null, 3, 3, 3, null, "bicycle", []], null, [1]],

这些字符串看起来是JSON,但是它们出现的字符串不是JSON,因此解析它没有任何意义。我也不需要解析此JSON,我需要将其从出现的字符串中删除。

唯一相同的部分是 ["pmeta", 并在结尾加上括号和逗号。

我正在探索正则表达式作为一种可能的解决方案,但是我对此并不陌生,还没有提出任何有用的建议。

任何人都可以给我一些正则表达式指针或提出其他实现此目的的方法吗?

2 个答案:

答案 0 :(得分:1)

您可以执行自定义解析,而不是使用正则表达式。它的工作方式如下:

  1. 查找输入中是否有任何以["pmeta"开头的内容。
  2. 将其计为startIndex
  3. 通过保留一堆方括号来找到该索引之后的最后一个括号的索引。您为每个左括号添加一个元素到堆栈中,为任何右括号删除一个元素。清空堆栈时,这是最后一个结束括号。算作endIndex
  4. 找到从startIndexendIndex的字符串部分,然后将其替换为null

我通过将长值替换为单个单词来缩短(并匿名化)您的示例:

let input = `)]}'
["rresp",
"one",
null,
120,
["pmeta",["/m/01pns0",null,3,3,3,null,"fire hydrant",[]
]
,null,[1]
]
,"dynamic",null,["bgdata","two","","three"]
,"four","five"]`

let output = clean(input);
console.log("output", output);

function clean(text) {
  let startIndex = text.indexOf('["pmeta"');

  //nothing to remove - early exit
  if (startIndex === -1) return text; 

  let endIndex = findLastOpenBracket(text, startIndex);
  
  let toReplace = text.substring(startIndex, endIndex);
  console.log("found text to replace:", toReplace);
  
  return text.replace(toReplace, "null")
}

function findLastOpenBracket(text, startIndex) {
  let openBrackets = [];
  
  for (let i = startIndex; i < text.length; i++) {
    let char = text[i];
    if (char === "[") {
      openBrackets.push(char);
    } else if (char === "]") {
      openBrackets.pop()
      
      if(openBrackets.length === 0){
        return i + 1
      }
    }
  }
}

这假设将是一个结束序列的右括号。诚然,findLastOpenBracket函数可以改进很多,但是我不知道这里的要求,它适合示例数据。至少,它是可以被替换的单一算法,其余步骤保持一致。

另一个注意事项:步骤4有点麻烦。不幸的是,JavaScript中没有用于字符串的.splice方法,因此您必须走很长的路-获取子字符串->替换字符串中的子字符串。如果需要,您可以改用Array.splice()方法,但我也觉得很麻烦:

let text = "one,two,three";

//replace "two"
let startIndex = 4;
let endIndex = 7;


let arr = text.split("");
arr.splice(
  startIndex, 
  endIndex - startIndex, 
  "null"
)

let output = arr.join("");
console.log(output);

答案 1 :(得分:0)

假设,在字符串中只有一次出现该模式,并且没有],的任何其他出现,则\["pmeta",.*\],可以工作。正则表达式演示:https://regex101.com/r/4DSfVR/1

JavaScript实现:

inputstr = 'djfhjkdfhkhdf ["pmeta", ["ImageSelectStoreFront", null, 3, 4, 2, null, "Storefront", []]],jdkfhkjdhf';
pattern = new RegExp('\\["pmeta",.*\\],',"gm");
console.log(inputstr.replace(pattern,""));