大括号扩展采用一个模式并将其扩展。例如:
sp{el,il,al}l
扩展为:
spell spill spall
是否有一种算法(可能使用 JavaScript 实现)以最小化构造字符串的方式进行反向操作?
即,接受一个数组[spell spill spall]
并返回一个字符串"sp{e,i,a}ll"
大括号扩展采用一个模式并将其扩展。例如:
sp{el,il,al}l
扩展为:
spell spill spall
是否有一种算法(可能使用 JavaScript 实现)以最小化构造字符串的方式进行反向操作?
即,接受一个数组[spell spill spall]
并返回一个字符串"sp{e,i,a}ll"
可以通过许多不同的方式来最小化生成的字符串,但是既然你提到了 Bash,我会选择不是最优化的 Bash 方式。
是的,有一种 Bash 方式!Bash 创建者已将其作为 readline 命令包含在内complete-into-braces
。当以交互方式使用 Bash 时,如果您点击Meta{(在我的机器上是Alt{或者Esc-then- {),所有可能的完成都将被分组到一个大括号扩展中。
$ echo /usr/
bin/ games/ include/ lib/ local/ sbin/ share/ src/
$ echo /usr/{bin,games,include,l{ib,ocal},s{bin,hare,rc}}
上面,我第一次点击Tab显示所有可能的完成,第二次点击Alt{.
回到你的问题:你正在寻找一种算法。显然,您可能会在Bash 源代码中找到一些东西。您正在寻找的功能really_munge_braces()
在bracecomp.c
正如原始问题中所要求的,node-brace-compression包含一个 JavaScript 实现。例如
var compress = require('brace-compression');
var data = [
'foo-1',
'foo-2',
'foo-3'
];
console.log(compress(data));
// => "foo-{1..3}"