-3

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

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+\]")但是没用。。

有什么建议么?

谢谢

解决方案:

看到你的答案后,我使用了

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

这工作得很好,谢谢大家!

4

6 回答 6

3
var t = str.Split(';').Select(s => s.Split(new char[]{'='}, 2)).Select(s => s.Last()).ToArray();
于 2013-10-01T09:32:39.620 回答
2

在正则表达式中,\d匹配任何数字,同时\D匹配任何数字。我认为您对后者的使用是错误的。此外,您应该允许您的正则表达式也使用字符类匹配否定符号、逗号和空格[\d\-, ]。您还可以包含字符的前瞻后视=,写为(?<=\=),以避免得到[0], [1], [2], ...

string str = "array[0]=[1,2,3,4,5,6];array[1]=[1,2,4,6,2,8];array[2]=[...]";
string[] results = Regex.Matches(str, @"(?<=\=)\[[\d\-, ]+\]")
                        .Cast<Match>()
                        .Select(m => m.Value)
                        .ToArray();
于 2013-10-01T09:30:54.363 回答
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();
        }
    }
}

奖金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();
于 2013-10-01T09:35:53.487 回答
0

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

- 按字符分割字符串;,你会得到一个字符串数组(例如string[]):"array[0]=[1,2,3,4,5,6]", "array[1]=[1,2 ,4,6,2,8]”,“数组[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。

于 2013-10-01T09:36:59.293 回答
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]);
}
于 2013-10-01T19:19:01.720 回答
0
string[] output=Regex.Matches(input,@"(?<!array)\[.*?\]")
                     .Cast<Match>()
                     .Select(x=>x.Value)
                     .ToArray();

或者

string[] output=Regex.Split(input,@";?array[\d+]=");
于 2013-10-01T09:38:59.923 回答