定界后从较大的字符串创建字符串数组

时间:2018-07-13 11:23:42

标签: c# regex string linq split

我有一个类似WideCharToMultiByte的字符串输入。 我想知道是否有一种在C#和LINQ中使用var input = "AB-PQ-EF=CD-IJ=XY-JK"方法的方法,这样我就可以得到看起来像string.split()的字符串数组。目前,我正在通过迭代输入字符串来手动进行相同的转换。

7 个答案:

答案 0 :(得分:7)

可以使用正则表达式代替split吗?

var input = "AB-PQ-EF=CD-IJ=XY-JK";
var pattern = new Regex(@"(?<![A-Z])(?=([A-Z]+[=-][A-Z]+))");
var output = pattern.Matches(input).Cast<Match>().Select(m => m.Groups[1].Value).ToArray();

答案 1 :(得分:0)

这是一个有效的脚本。如果您有一个固定的固定定界符,则只需查看一次对Regex.split的调用。您原始的字符串没有具有该字符串,但是我们可以轻松地在该输入中进行一些重复,以使该字符串变得可拆分。

string input = "ABC-PQ-EF=CD-IJ=XYZ-JK";
string s = Regex.Replace(input, @"((?<=[=-])[A-Z]+(?=[=-]))", "$1~$1");
Console.WriteLine(s);
var items = Regex.Split(s, @"(?<=[A-Z]{2}[=-][A-Z]{2})[~]");
foreach (var item in items)
{
    Console.WriteLine(item);
}

ABC-PQ~PQ-EF~EF=CD~CD-IJ~IJ=XYZ~XYZ-JK
ABC-PQ
PQ-EF
EF=CD
CD-IJ
IJ=XYZ
XYZ-JK

Demo

如果您仔细查看上面输出的第一行,将会看到我使用的技巧。我只是通过不同的定界符连接了所需的对(理想情况下,~不会出现在字符串的任何其他位置)。然后,我们只需要用该分隔符分开即可。

答案 2 :(得分:0)

对于使用string.Split和LINQ的解决方案,我们只需要跟踪行进的每个部分的长度,以便可以从原始字符串中拉出分隔符,如下所示:

var input = "ABC-PQ-EF=CDED-IJ=XY-JKLM";

var split = input.Split('-', '=');

int offset = 0;

var result = split
            .Take(split.Length - 1)
            .Select((part, index) => {
                offset += part.Length;
                return $"{part}{input[index + offset]}{split[index + 1]}";})
            .ToArray();

答案 3 :(得分:0)

您可以尝试以下方法: 这里我们将根据特殊字符分割字符串,然后循环遍历元素并选择直到下一个字符组。 例如:获取AB并获取直到PQ的值

        string valentry = "AB-PQ-EF=CD-IJ=XY-JK";
        List<string> filt = Regex.Split(valent, @"[\-|\=]").ToList();

        var listEle = new List<string>();
        fil.ForEach(x => 
            {
                if (valentry .IndexOf(x) != valentry .Length - 2)
                {
                    string ele = valentry.Substring(valentry .IndexOf(x), 5);
                    if (!String.IsNullOrEmpty(ele))
                        listEle.Add(ele);
                }
            });

enter image description here

答案 4 :(得分:0)

您能适应这样的事情吗?只需更改因子分解。

        List<string> lsOut = new List<string>() { };

        string sInput = "AB-PQ-EF=CD-IJ=XY-JK";
        string sTemp = "";


        for (int i = 0; i < sInput.Length; i++)
        {

            if ( (i + 1) % 6 == 0)
            {
                continue;
            }

            // add to temp
            sTemp += sInput[i];

            // multiple of 5, add all the temp to list
            if ( (i + 1 - lsOut.Count) % 5 == 0)
            {
                lsOut.Add(sTemp);
                sTemp = "";
            }

            if(sInput.Length == i + 1)
            {
                lsOut.Add(sTemp);
            }

        }

答案 5 :(得分:0)

        string input = "AB-PQ-EF=CD-IJ=XY-JK";
        var result = new Regex(@"(?<![A-Z])(?=([A-Z]+[=-][A-Z]+))").Matches(input)
            .Cast<Match>().Select(m => m.Groups[1].Value).ToArray();
        foreach (var item in result)
        {
            Console.WriteLine(item);
        }

答案 6 :(得分:0)

最近正在学习Haskell,因此这是一个递归解决方案。

static IEnumerable<string> SplitByPair(string input, char[] delimiter)
{
    var sep1 = input.IndexOfAny(delimiter);
    if (sep1 == -1)
    {
        yield break;
    }
    var sep2 = input.IndexOfAny(delimiter, sep1 + 1);
    if (sep2 == -1)
    {
        yield return input;
    }
    else
    {
        yield return input.Substring(0, sep2);
        foreach (var other in SplitByPair(input.Substring(sep1 + 1), delimiter))
        {
            yield return other;
        }
    }
}

好东西是

  • 这很懒
  • 易于扩展到其他条件和其他数据类型。但是,由于C#缺少Haskell的List.span和模式匹配,因此在C#中有点困难。