string - 生成带有变量的句子的所有可能组合
问题描述
假设我有一个包含多个变量的句子,如下所示:
"lorem ipsum {a, b} dolor {c, d, e} sit amet"
假设大括号中的字母是variables,如何从变量的所有可能组合中生成一组句子?
注意:每组变量中变量组 的数量或变量计数是未知的。
此特定示例的预期输出将是:
"lorem ipsum {a} dolor {c} sit amet"
"lorem ipsum {b} dolor {c} sit amet"
"lorem ipsum {a} dolor {d} sit amet"
"lorem ipsum {b} dolor {d} sit amet"
"lorem ipsum {a} dolor {e} sit amet"
"lorem ipsum {b} dolor {e} sit amet"
解决方案
在一般情况下(“变量组的数量......每个组内的计数......未知”)我们应该解析初始字符串(让我们在正则表达式的帮助下完成)然后枚举所有组合。
C#代码:
using System.Text.RegularExpressions;
...
private static IEnumerable<string> Generator(string source) {
// parsing: variables extracted: array of variables and their possible values
string[][] variables = Regex
.Matches(source, @"\{.*?\}")
.OfType<Match>()
.Select(match => match
.Value
.Trim('{', '}')
.Split(',')
.Select(item => "{" + item.Trim() + "}")
.ToArray())
.ToArray();
// now we should enumerate all possible variables' values
int[] indexes = new int[variables.Length];
do {
// code golf : ugly side effects but short code
int at = 0;
yield return Regex.Replace(source, @"\{.*?\}", match => variables[at][indexes[at++]]);
for (int i = 0; i < indexes.Length; ++i)
if (indexes[i] < variables[i].Length - 1) {
indexes[i] = indexes[i] + 1;
break;
}
else
indexes[i] = 0;
}
while (!indexes.All(index => index == 0));
}
演示:
string source = @"lorem ipsum {a, b} dolor {c, d, e} sit amet";
string report = string.Join(Environment.NewLine, Generator(source));
Console.Write(report);
结果:
lorem ipsum {a} dolor {c} sit amet
lorem ipsum {b} dolor {c} sit amet
lorem ipsum {a} dolor {d} sit amet
lorem ipsum {b} dolor {d} sit amet
lorem ipsum {a} dolor {e} sit amet
lorem ipsum {b} dolor {e} sit amet
另一个例子:
// 3 groups of variables with strange names
string source = @"lorem ipsum {A + 2, B, C?} dolor {XY, PQR} sit {eh?, bla-bla-bla} amet";
Console.Write(string.Join(Environment.NewLine, Generator(source)));
结果:
lorem ipsum {A + 2} dolor {XY} sit {eh?} amet
lorem ipsum {B} dolor {XY} sit {eh?} amet
lorem ipsum {C?} dolor {XY} sit {eh?} amet
lorem ipsum {A + 2} dolor {PQR} sit {eh?} amet
lorem ipsum {B} dolor {PQR} sit {eh?} amet
lorem ipsum {C?} dolor {PQR} sit {eh?} amet
lorem ipsum {A + 2} dolor {XY} sit {bla-bla-bla} amet
lorem ipsum {B} dolor {XY} sit {bla-bla-bla} amet
lorem ipsum {C?} dolor {XY} sit {bla-bla-bla} amet
lorem ipsum {A + 2} dolor {PQR} sit {bla-bla-bla} amet
lorem ipsum {B} dolor {PQR} sit {bla-bla-bla} amet
lorem ipsum {C?} dolor {PQR} sit {bla-bla-bla} amet
推荐阅读
- android - RecyclerView 滚动在 NestedScrollView 内不起作用
- javascript - 浏览器图像编解码器特征检测(JPEG2000)
- php - insert_id 的值一直返回 0
- java - 使用 Callable 和 ExecutorCompletionService,future.cancel() 不起作用
- sql - 总计和平均值以及数据
- mongodb - MongoDB 计数与来自另一个(连接)集合的值不同
- java - 为什么我无法在我的 Mac 中安装 netbeans?
- firebase - SwiftUI 在使用 Firebase 单击注销时隐藏 TabView
- jquery - jQuery AJAX 文件上传 - 从输入中获取实际文件
- vue.js - 从父组件中删除子项