确保将逗号分隔的字符串与字符串中的数字分开

时间:2013-07-10 16:17:00

标签: c# .net .net-2.0

我正在尝试拆分以下字符串

string v = "A: 1,5 ,B:2,44,C: 3,54,D: 5,11";

string[] val = v.Split(',');

for (int i = 0; i < val.Length; i++)
{
    val[i] = val[i].ToString().Trim();
}

问题是内部有逗号数字,因此拆分不正确。有没有办法在我的数组中得到正确的值“A:1,5”,“B:2,44”,“C:3,54”,“D:5,11”?我正在使用C#2.0

6 个答案:

答案 0 :(得分:2)

如果您的格式必须是一个字母,后面跟一个冒号,那么是一个浮点数,用逗号分隔这些条目:

string patternDelim = @"([A-Z]):"; // split on 'X:'
//                    @"([A-Z]+):" // split on 'ABC:'
//                    @"([A-Z][A-Z0-9]*):" // split on 'A1B2C3:'
string[] values = Regex.Split(input, patternDelim);

因为我们已经使用捕获组作为分隔符,它将最终出现在我们的输出中。所以,在这一点上,我们已经把输入分成了这样的东西:

A
 1,5 ,
B
2,44,
C
 3,54,
D
 5,11

现在我们只需要将它们提取到实际的数据对中:

Dictionary<string, string> pairs = new Dictionary<string, string>();
for (int ii = 0; ii < values.Length; ++ii)
{
    // empty values are skipped
    if (values[ii].Length == 0) continue;

    string value = values[ii + 1].Trim()
                                 .TrimEnd(','); // remove any trailing commas

    pairs.Add(values[ii], value.TrimEnd());
    ii++; // use two each time
}

这将产生一个键值对字典,如下所示:

A = 1,5
B = 2,44
C = 3,54
D = 5,11

您可以使用相应的CultureInfoNumberFormatInfo按照自己的意愿进行解析。注意,这也适用于所有小数分隔符,即使存在数千个分隔符:

Input = A: 1.000,5 ,B:2,44,C: 3,54e+38,D: -,11

A = 1.000,5
B = 2,44
C = 3,54e+38
D = -,11

答案 1 :(得分:1)

string v = "A: 1,5 ,B:2,44,C: 3,54,D: 5,11";

string[] val = Regex.Matches(v, @"\w+\s*\:\s*\d+\s*\,\s*\d+")
                    .Cast<Match>()
                    .Select(m => m.Value)
                    .ToArray();

答案 2 :(得分:0)

如果无法更改源字符串,我会拆分字母:

v.Split(new[] {'A', 'B', 'C', 'D'});

v.Split(new[] {"A:", "B:", "C:", "D:"});

而不是整理产生的部分。

答案 3 :(得分:0)

另一个丑陋的选择,虽然有效

static void Main(string[] args)
{
    string v = "A: 1,5 ,B:2,44,C: 3,54,D: 5,11";
    IEnumerable<string> result = Foo(v).ToArray();
    // A: 1,5
    // B:2,44
    // C: 3,54
    // D: 5,11
}

public static IEnumerable<string> Foo(string s)
{
    var sb = new StringBuilder();
    bool shouldFlush = false;
    bool firstIteration = true;
    foreach (char c in s)
    {
        if (!firstIteration)
        {
            shouldFlush = char.IsLetter(c);
        }
        if (shouldFlush)
        {
            string result = sb.ToString().Trim(' ', ',');
            sb.Clear();
            yield return result;
        }

        sb.Append(c);
        firstIteration = false;
    }

    yield return sb.ToString().Trim(' ', ',');
}

答案 4 :(得分:0)

string v = "A: 1,5 ,B:2,44,C: 3,54,D: 5,11";
string outstr = Regex.Replace(v, "([A-Z-a-z]+)(: *)([0-9]+,*[0-9]*)([ ,]*)", "$1:$3_");
string[] newStringArray = outstr.Split('_');

答案 5 :(得分:-1)

快速回答(未经测试):

string[] parts = v.Split(',');
List<string> grouped = new List<string>();

for(int i = 0; i < parts.Length; i++)
    grouped.Add(parts[i].Trim() + "," + parts[++i].Trim());