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

时间:2013-08-30 17:35:24

标签: c# regex range

我将范围定义为如下字符串:

[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,否则字母字符并不是那么简单。

2 个答案:

答案 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

Demo

答案 1 :(得分:1)

  

我对数字的想法是从范围中的最小数字开始,并在for循环中递增1,直到范围结束。但是,除非我转换为int并运行for循环并将int转换回char,否则字母字符并不是那么简单。

这样做可以解决问题,但是如果您需要将数字值设置为单位数字的前导零,则可以使用String.Format将它们恢复为"01"样式值。

相关问题