簡體   English   中英

正則表達式拆分字符串

[英]Regular expression to Split a string

我有一個像

XXX1234的屬性ISC_FLOW:實體為FLOW_VERIFY(IDCODE)&INITIALIZE&(IDCODE WAIT TCK 1 32:01805043 * 0FFFFFFF),&FLOW_ENABLE&INITIALIZE&(ISC_ENABLE WAIT TCK 3,20.0E-3),&FLOW_ERASE&

INITIALIZE&(ISC_ERASE WAIT TCK 3,200.0E-3)&(ISC_DISCHARGE WAIT TCK 3,200.0E-3),&FLOW_PRELOAD&INITIALIZE&(SAMPLE 68:0 WAIT TCK 1),&
FLOW_PROGRAM(ARRAY)&INITIALIZE&(ISC_ADDRESS_INIT WAIT TCK 1)&REPEAT 100&(ISC_PROGRAM 172 :? WAIT TCK 3,13.0E-3),&FLOW_VERIFY(ARRAY)&INITIALIZE&(ISC_ADDRESS_SHIFT 100:

$ ADDR = 800000000000000000000000&0&等待TCK 1)&REPEAT 100&(ISC_READ WAIT TCK 1,1.0E-3 172:?:CRC)&(ISC_ADDRESS_SHIFT 100:$ ADDR >> 1 WAIT TCK 1)

我需要編寫一個模式,該模式應分別拆分每個FLOW

這樣結果會像

1. FLOW_VERIFY(IDCODE)                  INITIALIZE        (IDCODE        WAIT TCK 1 32:01805043*0FFFFFFF)
2. FLOW_ENABLE                          INITIALIZE        (ISC_ENABLE    WAIT TCK 3, 20.0E-3)
3. FLOW_ERASE                           INITIALIZE        (ISC_ERASE     WAIT TCK 3, 200.0E-3)        (ISC_DISCHARGE WAIT TCK 3, 200.0E-3)
4. FLOW_PRELOAD                         INITIALIZE        (SAMPLE 68:0 WAIT TCK 1)
5. FLOW_PROGRAM(ARRAY)                  INITIALIZE        (ISC_ADDRESS_INIT         WAIT TCK 1)    REPEAT 100       (ISC_PROGRAM 172:? WAIT TCK 3, 13.0E-3)
6. FLOW_VERIFY(ARRAY)                   INITIALIZE        (ISC_ADDRESS_SHIFT 100:$ADDR=800000000000000000000000        0         WAIT TCK 1)      REPEAT 100  (ISC_READ  WAIT TCK 1, 1.0E-3 172:?:CRC) (ISC_ADDRESS_SHIFT 100:$ADDR>>1 WAIT TCK 1)

我嘗試了很多模式,但無法正確解析。

這是我終於嘗試過的模式。

"(?<Func>[a-z0-9\\(\\)_]*)[\r\t\n ]*&[\r\t\n ]*(?<Instr>(INITIALIZE|REPEAT|TERMINATE))[\r\t\n ]*[0-9]*&(?<Action>[0-9a-z \r\t\n:*,\\(\\).\\-_\\?!$=]*)"

請幫我寫一個模式,將每個FLOW值與上述字符串分開。

由於您的所有字段都很好地由&分隔,所以我建議

  • &分割字符串 ,這將為您提供一個數組,並且
  • 使用一些if語句遍歷數組。

我認為此解決方案比龐大的正則表達式更具可讀性(因此更易於維護)。

我試圖提出一個正則表達式,但我做不到。 我認為使用純字符串搜索會更簡單。 遵循以下原則:

string flows = "<your example>";
int index = -1;
List<string> flowStrings = new List<string>();
const string flowStr = "FLOW_";
index = flows.IndexOf(flowStr);
int nextIndex = flows.IndexOf(flowStr, index + 1);
while(index != -1 && nextIndex != -1)
{
    string currentFlow = flows.Substring(index, nextIndex - index);
    index = nextIndex;
    nextIndex = flows.IndexOf(flowStr, index + 1);
}

當然,我沒有太多使用正則表達式的經驗。

試試這個:

(?<Func>FLOW_(?:[A-Z]+)(?:\([A-Z]+\))?)\s+&\s+(?<Inst>[A-Z]+)\s+&\s(?<Action>(?:(?:(?:\([^)]+\))|[A-Z0-9\s]+)(?:\s?&\s)?)+)

由於我相信這個問題與您的其他問題( 如何在C#中拆分字符串 )有關,因此我相信這可能會對您有所幫助。

您可以使用此處提供解決方案將輸入數據分成幾個字符串(作為起點,在進行進一步解析之前)。

因此,如果您這樣定義Split方法:

private static List<string> Split(string input, IEnumerable<string> delimiters)
{
    List<string> results = new List<string>();
    List<int> indices = new List<int>();

    // get indices of delimiters
    foreach (string s in delimiters)
    {
        int idx = input.IndexOf(s);
        if (idx >= 0)
            indices.Add(idx);
    }
    indices.Sort();
    if (indices.Count > 0)
    {
        indices.Add(input.Length);
        // split the string
        for (int i = 0; i < indices.Count - 1; i++)
        {
            int idx = indices[i], nextIdx = indices[i + 1];
            results.Add(input.Substring(idx, nextIdx - idx).Trim());
        }
    }
    return results;
}

然后,它將在所有定義的“ FLOW”定界符處將其拆分:

string data = "ATTRIBUTE ISC_FLOW ...

string[] delimiters = new string[]
{
    "FLOW_VERIFY",
    "FLOW_ENABLE",
    "FLOW_ERASE",
    "FLOW_PRELOAD",
    "FLOW_PROGRAM"
};

List<string> results = Split(data, delimiters);
for (int i = 0; i < results.Count; i++)
{
    Console.WriteLine("{0}. {1}", i + 1, results[i]);
    Console.WriteLine();
}

Console.Read();

最后,您可以在&字符處分割每個結果,以獲得單獨的令牌:

foreach (string item in results)
{
    List<string> tokens = new List<string>();

    // split at &
    foreach (string t in item.Split('&'))
    {
        // trim spaces
        string token = t.Trim();

        // ignore empty tokens
        if (token == "")
            continue;

        tokens.Add(t);
    }

    // print tokens, separated by tabs
    foreach (string t in tokens)
        Console.Write("{0}\t", t);

    Console.WriteLine();
    Console.WriteLine();
}

暫無
暫無

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

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