目前,我正在尝试获取给定字符串的所有组合,同时保持所有内容的顺序。基本上,我想通过允许混合的假名/汉字答案来生成一个测验的替代答案列表,具体来说是日语。我遇到的障碍是根据给定的字符串和备用值生成所有可能的假名/汉字组合的数组。
'{月曜日}と{水曜日}と{金曜日}に{日本語}のクラスがあります'
中的花括号决定了我想用'げつようび|すいようび|きんようび|にほんご'
中的替代值替换的文本。但是,这些值仅应替换其各自的汉字,或更简单地说,是其索引。
我对下面要实现的目标有一个总体了解。但是,它不会返回所有可能性,甚至不会创建某些重复项。老实说,我想我可能对此考虑过头,让自己头疼。
感谢您的帮助。
function getCombos (str, alt) {
var a = str.match(/(\{.*?\})/g),
b = alt.split('|'),
c = [], s,
i = 0, j = a.length, k;
for (; i < j; i++) {
s = str.replace(a[i], b[i]);
c.push(s.replace(/\{|\}/g, ''));
for (k = 0; k < j; k++) {
if (k != i) {
s = s.replace(a[k], b[k]);
c.push(s.replace(/\{|\}/g, ''));
}
}
}
return c;
};
console.log(getCombos('{月曜日}と{水曜日}と{金曜日}に{日本語}のクラスがあります', 'げつようび|すいようび|きんようび|にほんご'));
睡在上面并清醒我的头,这是我想出的解决方案。这有点骇人听闻,但似乎涵盖了几乎所有可能的组合。如果有人有更好的解决方案,或者想对我提出的方案有所改进,我欢迎您提供任何答复。
感谢您的帮助。
function getCombos (str, alt) {
var a = str.match(/(\{.*?\})/g),
b = alt.split('|'),
c = [],
len = a.length,
i = 0, j, k, l, m,
S1, S2, S3, S4, S5,
cleaned;
for (; i < len; i++) {
// strings to be used for various combos
S5 = S4 = S3 = S2 = S1 = str.replace(a[i], b[i]);
c.push(S1.replace(/\{|\}/g, ''));
// variables for looping in multiple directions
j = 0;
k = len;
l = Math.floor(len / 2);
m = Math.ceil(len / 2);
while (j < len || k > -1 || l < len || m > -1) {
// fill left --> right
if (j < len) {
if (j != i) {
S2 = S2.replace(a[j], b[j]);
cleaned = S2.replace(/\{|\}/g, '');
if (c.indexOf(cleaned) == -1) {
c.push(cleaned);
}
}
j++;
}
// fill right --> left
if (k > -1) {
if (k != i) {
S3 = S3.replace(a[k], b[k]);
cleaned = S3.replace(/\{|\}/g, '');
if (c.indexOf(cleaned) == -1) {
c.push(cleaned);
}
}
k--;
}
// fill middle --> right
if (l < len) {
if (l != i) {
S4 = S4.replace(a[l], b[l]);
cleaned = S4.replace(/\{|\}/g, '');
if (c.indexOf(cleaned) == -1) {
c.push(cleaned);
}
}
l++;
}
// fill middle --> left
if (m > -1) {
if (m != i) {
S5 = S5.replace(a[m], b[m]);
cleaned = S5.replace(/\{|\}/g, '');
if (c.indexOf(cleaned) == -1) {
c.push(cleaned);
}
}
m--;
}
}
}
return c;
};
console.log(getCombos('{月曜日}と{水曜日}と{金曜日}に{日本語}のクラスがあります', 'げつようび|すいようび|きんようび|にほんご'));