JavaScript-查找和替换仅匹配的右括号

时间:2020-08-11 14:12:15

标签: javascript

我想知道是否有一种优雅的方法来找到并替换与代码对应的括号,具体取决于开头括号附近的内容。例如,我可能要转换:

public class MyCompositeItemWriter<T> implements ItemWriter<T> {
      private List<ItemWriter<? super T>> delegates;
 
    @Override
      public void write(List<? extends T> items) throws Exception {
            for(ItemWriter delegate : delegates) {
               try {
                  delegate.write(items);
               }
               catch (Exception e) {
                  // Do logging/error handling here
               }
            }
    }

    @Override
    public void setDelegates(List<ItemWriter<? super T>> delegates) {
        super.setDelegates(delegates);
        this.delegates = delegates;
    }
}

进入:

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

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

我不想更改其他任何左括号和右括号。是否有一种优雅的方法?我发现最接近的东西是Javascript replace opening and closing brackets,但它似乎更像是一种用偶然的例外替换所有方括号的方法,而不是用特定的括号替换掉大部分内容的方法。

我唯一的想法是计算括号的开合,但这至少可以说很难看。有没有更整齐的方法?

1 个答案:

答案 0 :(得分: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字符,后跟一个(字符,然后忽略所有具有相应右括号的左括号,并将所有这些与不带右括号的字符放在一起)分组,然后寻找)字符。

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

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