【问题标题】:javascript - find and replace only matching closing bracketjavascript - 仅查找和替换匹配的右括号
【发布时间】:2020-08-11 23:14:25
【问题描述】:

我想知道是否有一种优雅的方法可以根据左括号附近的内容来查找和替换匹配的代码括号。例如,我可能想转换:

// code for random_number() function
for(i in 1:5){
   print(i);
   mean(c(1,2,random_number()))
   sd(c(4,5,6))
}

进入:

// code for random_number() function
for(i in 1:5){
   print(i);
   mean([1,2,random_number()])
   sd([4,5,6])
}

因为我要做的就是将“c(1,2,3)”转换为“[1,2,3]”(以及“c(4,5,6)”转换为“[4,5, 6]”)。我想在这样的脚本中识别与“c(”相对的右括号。

我不想更改任何其他的开始和结束括号。有没有一种优雅的方式来做到这一点?我找到的最接近的东西是Javascript replace opening and closing brackets,但它似乎更像是一种将所有括号替换为偶尔例外的方法,而不是特定括号但忽略大多数。

我唯一的想法是计算括号的开始和结束,但至少可以这么说,这看起来很丑陋。有没有更整洁的方式?

【问题讨论】:

  • func(1,2,3) 呢?
  • 抱歉 - 我不确定我是否关注,您能详细说明一下吗? (如果相关,这些数字只是示例数字)
  • 可能有函数以c 结尾,而(a, b, c) 等参数不是数组。根据您的书面逻辑,func(1, 2, 3) 最终将被替换为fun[1, 2, 3]。我不知道您的用例或环境 - 只是需要注意的事情。
  • 那...这是一个很好的观点。感谢您的提醒!

标签: javascript


【解决方案1】:

您可以为此使用 RegExp,例如:c\((([^)]*\([^)]*\))*[^)]*)\) 这是一个例子:

const regExp = /c\((([^)]*\([^)]*\))*[^)]*)\)/g;
const source = `// code for random_number() function
for(i in 1:5){
   print(i);
   mean(c(1,2,random_number()))
   sd(c(4,5,6))
}`;
const result = source.replace(regExp, '[$1]')
console.log(result);

这可能会因更复杂的源字符串而失败。

它的作用是查找c 字符后跟( 字符,然后忽略所有具有相应右括号的左括号,并将所有这些与任何不是) 的字符一起放置进入一个组,然后查找) 字符。

用正则表达式平衡括号不是一个好主意,这仅适用于一个级别(当有两个左括号而它们之间没有右括号时会失败)。更可靠的方法是循环字符串并跟踪所有的开始和结束括号。

除此之外,正则表达式不区分作为代码一部分的括号或作为字符串文字一部分的括号。

【讨论】:

  • 同意titus - 到目前为止,这似乎解决了我的问题(一旦我做了一些检查,可能会接受)
  • 实际上,抱歉,是的,这是一个问题:我正在寻找一种方法,让 mean(c(1,2,giveMeARandomNumber())) 变为 mean([1,2,giveMeARandomNumber()]),而不是 mean([1,2,giveMeARandomNumber(])) - 我会更新我的问题来解决这个问题
  • @Lain 是的,确实如此。我已经编辑了我的答案来解决这个问题。
  • @Lain 我已经用* 替换了?,现在也涵盖了这些情况。
  • 我实际上已经尝试过使用正则表达式(平衡括号)来执行此操作,并确定它不能正确完成(或者至少我不能)但还是决定发布答案。我值得所有的审查。我将在答案中添加一个披露,以便其他人不会在不知道它很可能会失败的情况下尝试使用它。
猜你喜欢
  • 2019-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-06
  • 1970-01-01
  • 1970-01-01
  • 2016-07-25
相关资源
最近更新 更多