あなたが使用できる.netのライブラリに組み込まれているものは何もありません。検証も必要であることを考えると、タスクは非常に複雑です。最初の入力に基づいて文字列を生成するための小さなソリューションを作成しました。これは製品コードではなく、いくつかのチェックを省略していることに注意してください。このコードは、実行方法の 1 つの可能な方法のみを示しており、批判の余地があります。Token
文字列の各論理部分を表します。この場合、リテラルまたは範囲指定子のいずれかです。
class Token
{
public string Value { get; set; }
public IEnumerable<string> GetAllValues()
{
if(IsRange(Value))
{
var rangeValues = Value.Split(new[] {'[', '-', ']'}, StringSplitOptions.RemoveEmptyEntries);
//numeric format defines minimal string length. [01-10] will have numericFormat = "{0:00}"
string numericFormat = CreateNumericFormat(rangeValues.ElementAt(0).Length);
int[] ranges = rangeValues.Select(val => int.Parse(val)).ToArray();
foreach (var val in GetRange(ranges[0], ranges[1]))
yield return string.Format(numericFormat, val);
}
else
{
yield return Value;
}
}
//validation is ommited
private bool IsRange(string val)
{
return Value.Contains("-");
}
private string CreateNumericFormat(int minimalLength)
{
return "{0:"+new string('0', minimalLength)+"}";
}
private IEnumerable<int> GetRange(int minValue, int maxValue)
{
return Enumerable.Range(minValue, maxValue - minValue + 1);
}
}
使い方はとても簡単です:
var initial = "12[05-10]3[008-010]";
var regularExp = @"\[\s*\d+\s*-\s*\d+\s*\]|\d+";
List<Token> tokens = new List<Token>();
foreach (Match match in Regex.Matches(initial , regularExp ))
{
tokens.Add(new Token {Value = match.Value});
}
IEnumerable<string> result = new []{""};//empty source for start
foreach(var token in tokens)
{
result = from v1 in result
from v2 in token.GetAllValues()
select v1 + v2;
}
//Dump is LinqPad specific call
result.Dump();
版画:
12053008
12053009
12053010
12063008
12063009
12063010
12073008
12073009
12073010
12083008
12083009
12083010
12093008
12093009
12093010
12103008
12103009
12103010