0

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

[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,直到范围结束。但是,除非我转换为 anint并运行 for 循环并将int返回转换为 char,否则对于字母字符来说并不是那么直接。

4

2 回答 2

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

于 2013-08-30T17:52:17.503 回答
1

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

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

于 2013-08-30T17:42:49.343 回答