将字符串分成2部分(字符串有不同的模式)

本文关键字:字符串 模式 2部 | 更新日期: 2023-09-27 17:51:10

我需要帮助来开发一个逻辑,使我能够在字符串集合中定位字符串的第一部分。下面是一些真实的示例数据:

string s1 = "DARK BLUE          |d RBH 775  GREEN          |v BHM 554       |r 0012"
string s2 = "MEGA |m RMV 451X"
string s3 = "UPR  INT|c 0124  UPR|r 0006"
string s4 = "DARK GREEN  021|r 0004"
string s5 = "02.80|r x12  03.00|r calc"
string s6 = "03.33|r calc"
预期输出:

string out1[] = "DARK BLUE          ", "|d RBH 775  GREEN          |v BHM 554       |r 0012""
string out2[] = "MEGA ", "|m RMV 451X"
string out3[] = "UPR  ", "INT|c 0124  UPR|r 0006"
string out4[] = "DARK GREEN  ", "021|r 0004"
string out5[] = "02.80", "|r x12  03.00|r calc"
string out6[] = "03.33", "|r calc"

一般来说,所有字符串都有两种模式:

模式1:(Value)(| with a letter)(Value)(| with a letter)…

模式2:(Value)(Value)(|带字母)(Key)(Value)(|带字母)(Key)…

也可以有模式1和模式2的组合,即:(Value)(|带字母)(Value)(|带字母)(Key)(Value)(|带字母)…,但我认为这并不太重要,因为我只需要识别"第一部分"的模式

指出

:我能够逐案解决这个问题:

对于s1, s2, s5和s6,我只需要找到第一个|的索引,然后将0的子串取到第一个管道,然后再取其余的;对于s3,我可以找到第一个"空白空间"并取子字符串;然后对于s4,我将找到第一个|,然后找到最后一个"空白空间"在|,并取子字符串。

问题是:大约有40,000多个字符串,所以我几乎不可能逐个拆分字符串。我想知道是否有可能编写一个可以自动将字符串分成2部分的逻辑?

更新:尽管有2种一般模式,但每种模式都有一些轻微的变化。例如,s1和s2:在|前面有空格,但s5和s6没有。

将字符串分成2部分(字符串有不同的模式)

我相信你可以使用正则表达式解决这个问题;但我绝不是一个正则表达式专家。但是从你给出的信息来看,手工编写代码很容易:

string[] Parse(string line)
{
    var chars = new List<char>(); // characters since last whitespace
    var all = new List<char>();
    using(var i = line.GetEnumerator())
    while(i.MoveNext())
    {
        var current = (char)i.Current;
        // keep track of characters since last whitespace
        if (current == ' ')      chars.Clear();
        else if (current != '|') chars.Add(current);
        // read until first pipe
        if(current == '|')
            return BuildResult(i, all, chars);
        all.Add(current);
    }
    return new String[]{};
}
string[] BuildResult(IEnumerator i, List<char> all, List<char> chars)
{
    var rest = (new[]{'|'}).Concat(ReadRemaining(i));
    var diff = all.Count - chars.Count;
    IEnumerable<char> start = chars;
    IEnumerable<char>   end = rest;
    if(diff != 0)
    {
        // if there was a whitespace, the chars 
        // before | belong to group 1
        start = all.Take(diff);
        end = chars.Concat(rest);
    }
    return new []{new String(start.ToArray()), new String(end.ToArray())};
}
string ReadRemaining(IEnumerator i)
{
    var rest = new List<Char>();
    while(i.MoveNext())
        rest.Add((char)i.Current);
    return new String(rest.ToArray());
}

思路如下:

  • 遍历字符串中的每个字符,直到遇到|
  • 空格前的所有字符属于第1组。
  • 根据我们是否已经看到了一个空白字符,确定自最后一个空白字符以来我们所看到的所有字符是否属于组1 (s3s4)或组2 (s5s6)。