查找数值或字母范围之间的值
本文关键字:范围 之间 查找 | 更新日期: 2023-09-27 18:29:37
我将范围定义为字符串,如下所示:
[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循环中递增一,直到范围结束。然而,对于字母表字符来说,这并不完全是直接的,除非我转换为int
并运行for循环并将int
强制转换回char。
不是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
演示
我对数字的想法是从范围内的最低数字开始,在for循环中递增一,直到范围结束。然而,对于字母表字符来说,这并不完全是直接的,除非我转换为int并运行for循环并将int强制转换回char。
这样就可以了,但如果你需要你的数值在个位数上有前导零,你可以使用String.Format
将它们恢复到"01"
样式的值。