说我有一个像这样的字符串:
user@COMP:~$ sudo su -
root@COMP:~# cmd.exe /c echo works! # merely for documentation
cmd.exe: command not found
root@COMP:~# echo "${#PATH}" # merely for documentation
70
root@COMP:~# cmd_path=`/mnt/c/Windows/System32/cmd.exe /C echo "%path:\\\\=\\\\\\\\%"`
root@COMP:~# OIFS="$IFS" # backup $IFS
root@COMP:~# IFS=';'
root@COMP:~# read -a c_p_n <<< "${cmd_path}"
root@COMP:~# IFS="$OIFS" # restore $IFS
root@COMP:~# OPATH="${PATH}" # backup $PATH
root@COMP:~# for i in "${!c_p_n[@]}"; do PATH=${PATH%/}:$(sed -e 's#^\(.\):#/mnt/\L\1#' -e 's#\\#/#g' <<< "${c_p_n[$i]}"); done
root@COMP:~# echo "${#PATH}" # merely for documentation
1555
root@COMP:~# cmd.exe /c echo works! # merely for documentation
works!
和类似的数组:
const m = 'Map<?,?>';
并且我希望生成:
const types = ['string', 'boolean'];
我该怎么做? 注意,我不需要在模板字符串中使用问号,我可以使用其他字符,也许像这样:
const r = 'Map<string,boolean>'
也请注意,因为我的模板未包装在函数中,因此我不能使用具有这种性质的{6} ES6模板字符串。
我相信这将在Node.js中起作用:
const m = 'Map<%s,%s>';
但是我想我正在寻找一种使用问号字符(?)而不是使用%s的方法。
答案 0 :(得分:4)
替换仅替换第一个找到的位置,而reduce可以轻松迭代给定的替换。
const m = 'Map<?,?>';
const types = ['string', 'boolean'];
const n = types.reduce((n, t) => n.replace('?', t), m);
console.log(n);
或将其形式化为功能:
function format(str, key, replacements){
return replacements.reduce((s, t) => s.replace(k, t), str);
}
答案 1 :(得分:2)
您还可以直接使用replace()
进行一些精美的关闭工作来捕获索引(可悲的是,该索引没有传递给replace回调函数):
const m = 'Map<?,?>';
const types = ['string', 'boolean'];
let rep = m.replace(/\?/g, ((i) => () => types[i++])(0)) // i is simple a count of matches starting at 0
console.log(rep)
如果立即执行的功能太怪异,则可以将整个内容包装为一个简单的函数,使您的眼睛更容易一些:
const m = 'Map<?,?>';
const types = ['string', 'boolean'];
function replaceMatch(str, arr){
let i = 0
return str.replace(/\?/g, () => arr[i++])
}
console.log(replaceMatch(m, types))
答案 2 :(得分:1)
您只需要一个?
const types = ['string', 'boolean'];
console.log('Map<?>'.split('?').join(types))
或
const types = ['string', 'boolean'];
console.log('Map<?>'.replace('?', types))
或者如果您希望保留?,?
const types = ['string', 'boolean'];
console.log('Map<?,?>'.replace('?,?', types))