簡體   English   中英

將字符串分成兩部分(字符串具有不同的模式)

[英]Split strings into 2 parts (strings have different patterns)

我需要幫助來開發一種邏輯,使我能夠在字符串集合中找到字符串的第一部分。 以下是一些實際的示例數據:

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"

通常,所有字符串都帶有2種模式:

模式1:(值)(|帶字母)(值)(|帶字母)...

模式2:(值)(值)(|帶字母)(鍵)(值)(|帶字母)(鍵)...

也可以組合使用模式1和2,即:(Value)(|帶字母)(Value)(|帶字母)(Key)(Value)(|帶字母)...,但我認為這並不重要,因為我只需要確定“第一部分”的模式

注意 :我能夠逐案解決問題:

對於s1,s2,s5和s6,我只需找到第一個|的索引,然后將0的子字符串帶到第一個管道,然后是其余管道即可。 對於s3,我可以找到第一個“空空間”並獲取子字符串。 然后對於s4,我將找到第一個|,然后在|之前找到最后一個“空空間”,並獲取子字符串。

問題是:大約有40,000多個字符串,因此我幾乎不可能逐案拆分字符串。 我想知道是否可以編寫一種邏輯來將字符串自動分為兩部分?

更新:盡管有2種常規模式,但是每種模式都有一些細微的差異。 例如,s1和s2:|前面有空格,但s5和s6沒有。

我相信您可以使用正則表達式解決此問題; 但我絕不是正則表達式專家。 但是根據您提供的信息,手動編寫代碼很容易:

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 )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM