正则表达式来分割字符串

问题描述:

我在等XXX1234正则表达式来分割字符串

ATTRIBUTE 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Ť CK 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 WAIT TCK 1)& REPEAT 100 &(ISC_READ WAIT TCK 1,1.0E- 3172:?:CRC)&(ISC_ADDRESS_SHIFT 100:$ ADDR >> 1个WAIT TCK 1)

我需要编写应seperately分裂每个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值的模式。

由于我相信这个问题与您的其他问题(How to split a string in C#)有关,我相信这可能会对您有所帮助。

您可以使用solution provided there将输入数据拆分为多个字符串(作为开始点,在进一步解析之前)。

所以,如果你像这样定义你的拆分方法:

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; 
} 

,那么这将拆分它在所有定义的“流动”分隔符:

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

我试图想出一个正则表达式,我不能。我认为使用纯字符串搜索会更简单。沿着以下线路:

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)?)+) 

由于所有的字段都很好地通过&分开,我会建议

  • split the string&,它给你一个数组,
  • 迭代通过几个if陈述的阵列。

我认为这个解决方案比一个巨大的正则表达式更具可读性(因此更易于维护)。