我将范围定义为如下字符串:
[a-d]
[A-H]
[c,d]
[B,C]
[03-05]
我如何找到介于两者之间的值,使得输出是这样的?
[a-d]
a
b
c
d
[A-H]
A
B
C
D
E
F
G
H
[c,d]
c
d
[B,C]
B
C
[03-05]
03
04
05
我正在使用此正则表达式来解析范围:
\[(.?+)[,|-](.?+)\]
有时范围只包含两个数字或两个字母,因此使用逗号表示法。
我对数字的想法是从范围中的最小数字开始,并在for循环中递增1,直到范围结束。但是,除非我转换为int
并运行for循环并将int
转换回char,否则字母字符并不是那么简单。
答案 0 :(得分:2)
不是100%但接近:)
var rangeStrings = new List<string> { "[a-d]", "[A-H]", "[c,d]", "[B,C]", "[03-05]" };
var separator = new[] { "-", "," };
IEnumerable<IEnumerable<string>> ranges = rangeStrings
.Select(rs =>
{
string inner = rs.Replace("[", "").Replace("]", "");
string[] token = inner.Split(separator, StringSplitOptions.RemoveEmptyEntries);
bool isNumeric = token[0].All(Char.IsDigit);
int start, end;
if(isNumeric)
{
start = int.Parse(token.First());
end = int.Parse(token.Last());
}
else
{
start = (int)token.First().First();
end = (int)token.Last().Last();
}
var range = Enumerable.Range(start, end - start + 1)
.Select(i => isNumeric ? i.ToString() : ((Char)i).ToString());
return range;
});
foreach (var range in ranges)
{
Console.WriteLine("Range: {0}", string.Join(",", range));
}
输出:
Range: a,b,c,d
Range: A,B,C,D,E,F,G,H
Range: c,d
Range: B,C
Range: 3,4,5 // <-- this makes problems
答案 1 :(得分:1)
我对数字的想法是从范围中的最小数字开始,并在for循环中递增1,直到范围结束。但是,除非我转换为int并运行for循环并将int转换回char,否则字母字符并不是那么简单。
这样做可以解决问题,但是如果您需要将数字值设置为单位数字的前导零,则可以使用String.Format
将它们恢复为"01"
样式值。