3

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

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

4

6 回答 6

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
于 2013-07-10T16:43:59.827 回答
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();
于 2013-07-10T16:25:00.630 回答
0

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

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

或者

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

然后整理生成的部分。

于 2013-07-10T16:24:18.883 回答
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(' ', ',');
}
于 2013-07-10T16:43:31.247 回答
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('_');
于 2013-07-10T17:43:37.547 回答
-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());
于 2013-07-10T16:30:00.143 回答