拆分包含数组的字符串以获取值C#的数组

时间:2013-10-01 09:26:40

标签: c# regex arrays string split

我有一个包含数组的字符串

string str = "array[0]=[1,a,3,4,asdf54,6];array[1]=[1aaa,2,4,k=6,2,8];array[2]=[...]";

我想把它拆分成这样的数组:

str[0] = "[1,a,3,4,asdf54,6]";
str[1] = "[1aaa,2,4,k=6,2,8]";
str[2] = ....

我尝试使用Regex.Split(str, @"\[\D+\]"),但它没有用。

有什么建议吗?

由于

SOLUTION:

看过你的答案后我用了

var arr = Regex.Split(str, @"\];array\[[\d, -]+\]=\[");

这很好用,谢谢大家!

6 个答案:

答案 0 :(得分:3)

var t = str.Split(';').Select(s => s.Split(new char[]{'='}, 2)).Select(s => s.Last()).ToArray();

答案 1 :(得分:2)

在正则表达式中,\d匹配任何数字,而\D匹配数字的任何数字。我假设你使用后者是错误的。此外,您应该允许正则表达式使用字符类[\d\-, ]来匹配否定符号,逗号和空格。您还可以为=字符添加 lookahead lookbehind,写为(?<=\=),以避免获得[0][1],{ {1}},...

[2]

答案 2 :(得分:1)

试试这个 - 使用正则表达式查看后面的内容以获取字符串的相关部分。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Text.RegularExpressions;

namespace RegexSplit
{
    class Program
    {
        static void Main(string[] args)
        {
            string str = "array[0]=[1,2,3,4,5,6];array[1]=[1,2,4,6,2,8];array[2]=[...]";

            Regex r = new Regex(@"(?<=\]=)(\[.+?\])");

            string[] results = r.Matches(str).Cast<Match>().Select(p => p.Groups[1].Value).ToArray();
        }
    }
}

BONUS - 如果您喜欢,请转换为int[][]

int[][] ints = results.Select(p => p.Split(new [] {'[', ',', ']'}, StringSplitOptions.RemoveEmptyEntries)
                .Where(s => { int temp; return int.TryParse(s, out temp);}) //omits the '...' match from your sample. potentially you could change the regex pattern to only catch digits but that isnt what you wanted (i dont think)
                .Select(s => int.Parse(s)).ToArray()).ToArray();

答案 3 :(得分:0)

正则表达式是一种选择,但它会有点复杂。假设您没有输入解析器,可以尝试以下操作:

- 按;字符拆分字符串,你会得到一个字符串数组(例如string[]): “array [0] = [1,2,3,4,5,6]”,“array [1] = [1,2,4,6,2,8]”,“array [2] = [。 ..]”。我们称之为list

然后对于该数组中的每个元素(假设输入是有序的),执行以下操作: - 找到]=的索引,让它为x。 - 从起始索引x + 2中获取整个字符串的子字符串。我们称之为sub。 - 将结果字符串分配为数组中的当前字符串,例如如果您使用常规for循环进行迭代,并且索引变量为i,例如for(int i = 0; i < len; i++){...}

list[i] = sub

我知道这是一个肮脏且容易出错的解决方案,例如:如果输入为array[0] =[1,2...而不是array[0]=[1,2,...,则由于其中的额外空间而无法正常工作,但如果您的输入会计算完全模式(没有额外的空格,没有换行符等) ),它会完成这项工作。

更新: cosset的答案似乎是实现结果的最实用,最简单的方法,特别是如果您熟悉LINQ。

答案 4 :(得分:0)

string[] output=Regex.Matches(input,@"(?<!array)\[.*?\]")
                     .Cast<Match>()
                     .Select(x=>x.Value)
                     .ToArray();

string[] output=Regex.Split(input,@";?array[\d+]=");

答案 5 :(得分:0)

string str = "array[0]=[1,a,3,4,asdf54,6];array[1]=[1aaa,2,4,k=6,2,8];array[2]=[2,3,2,3,2,3=3k3k]";
string[] m1 = str.Split(';');
List<string> m3 = new List<string>();
foreach (string ms in m1)
{
    string[] m2 = ms.Split('=');
    m3.Add(m2[1]);
}