4

大括号扩展采用一个模式并将其扩展。例如:

sp{el,il,al}l

扩展为:

spell spill spall

是否有一种算法(可能使用 JavaScript 实现)以最小化构造字符串的方式进行反向操作?

即,接受一个数组[spell spill spall]并返回一个字符串"sp{e,i,a}ll"

4

2 回答 2

4

可以通过许多不同的方式来最小化生成的字符串,但是既然你提到了 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

于 2018-10-17T21:27:05.560 回答
1

正如原始问题中所要求的,node-brace-compression包含一个 JavaScript 实现。例如

var compress = require('brace-compression');
var data = [
  'foo-1',
  'foo-2',
  'foo-3'
];

console.log(compress(data));
// => "foo-{1..3}"
于 2019-01-01T21:14:10.157 回答