查找数值或字母范围之间的值

本文关键字:范围 之间 查找 | 更新日期: 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"样式的值。