我想知道是否有一种优雅的方法来找到并替换与代码对应的括号,具体取决于开头括号附近的内容。例如,我可能要转换:
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,但它似乎更像是一种用偶然的例外替换所有方括号的方法,而不是用特定的括号替换掉大部分内容的方法。
我唯一的想法是计算括号的开合,但这至少可以说很难看。有没有更整齐的方法?
答案 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
字符,后跟一个(
字符,然后忽略所有具有相应右括号的左括号,并将所有这些与不带右括号的字符放在一起)
分组,然后寻找)
字符。
用正则表达式平衡括号不是一个好主意,这仅适用于一个级别(当有两个开括号而在它们之间没有闭括号时会失败)。一种更可靠的方法是使字符串循环并跟踪所有打开和关闭括号。
除此之外,正则表达式不能区分代码中的括号或字符串文字中的括号。