【问题标题】:Split string that contains array to get array of values C#拆分包含数组的字符串以获取值数组 C#
【发布时间】:2013-10-01 09:26:39
【问题描述】:

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

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, -]+\]=\[");

这很好用,谢谢大家!

【问题讨论】:

  • string.Splitstring.Replace 有什么问题?
  • 你的解决方案不起作用。它不会正确拆分第一个数组。你也应该标记或至少投票给对你有帮助的答案
  • -1:下一次,在第一次正确地问问题上付出更多的努力。贡献者每次对规范进行随机编辑时都不断更新他们的答案是浪费时间。

标签: c# regex arrays string split


【解决方案1】:
var t = str.Split(';').Select(s => s.Split(new char[]{'='}, 2)).Select(s => s.Last()).ToArray();

【讨论】:

  • 这简直太优雅了。
  • 请注意,这部分表达式的代码不能正常工作:array[1]=[1aaa,2,4,k=6,2,8]
  • 问题被编辑了。我写答案的时候,没有这部分表达
  • 假设每个中间标记的第一个等号是您想要拆分的那个可能是安全的,所以这应该可以工作s.Split(new Char[] {'='}, 2)
【解决方案2】:

在正则表达式中,\d 匹配任何数字,而\D 匹配任何数字的东西。我认为您对后者的使用是错误的。此外,您应该允许您的正则表达式也匹配否定符号、逗号和空格,使用字符类[\d\-, ]。您还可以为= 字符添加一个lookahead 后视,写为(?<=\=),以避免出现[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();

【讨论】:

  • 很好,但现在我得到:“=[1,2,3,4,5,6];array”。最后如何删除 = 和数组?
  • @Asaf:我已经从Regex.Split 切换到Regex.Matches;这应该可以解决它。
  • @Douglas:我现在得到一个空数组
  • @Asaf:你能粘贴你的源字符串吗?对于上面的 sn-p,我得到了正确的结果。
  • +1 以获得最佳整体解决方案——但我会赞成你切换到Matches()。 ;) 仅供参考,(?&lt;=\=) 是一个lookbehind,而不是一个lookahead,你不必转义等号:(?&lt;==)
【解决方案3】:

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

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();

【讨论】:

  • 在检索整个匹配的子字符串时不需要使用捕获组。你会在matchObj.Groups[0].Value 中找到它,但由于Groups[0] 指的是Match 对象本身,你可以直接说matchObj.Value。 (参考:Match Class,在备注部分)。
  • @AlanMoore 我更喜欢在合理的情况下明确表达。我发现它可以防止令人讨厌的意外。
【解决方案4】:

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

-用;字符分割字符串,你会得到一个字符串数组(例如string[]): “数组[0]=[1,2,3,4,5,6]”,“数组[1]=[1,2,4,6,2,8]”,“数组[2]=[。 ..]”。我们就叫它list吧。

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

list[i] = sub.

我知道这是一个肮脏且容易出错的解决方案,例如如果输入是array[0] =[1,2... 而不是array[0]=[1,2,...,由于那里有额外的空间,它将无法工作,但是如果您的输入数学符合 exact 模式(没有额外的空格,没有换行符等),它将做好工作。

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

【讨论】:

  • 正则表达式只有在您不熟悉时才会复杂。如果你的桌面/浏览器上有一个 IDE,那么任务就更容易了。
  • 是的,很多人,甚至很多程序员(包括我)都对正则表达式非常陌生。 (我的意思是,知道这绝对是一件好事,但这需要时间,而且我还有其他优先事项)那么你能推荐任何好的免费正则表达式 ide 或网站吗?
【解决方案5】:
string[] output=Regex.Matches(input,@"(?<!array)\[.*?\]")
                     .Cast<Match>()
                     .Select(x=>x.Value)
                     .ToArray();

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

【讨论】:

    【解决方案6】:
    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]);
    }
    

    【讨论】:

    • 这个答案和cosset's有同样的问题;您需要限制第二次拆分:ms.Split(new Char[] {'='}, 2)
    猜你喜欢
    • 2020-10-19
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多