正则表达式来分割字符串
我在等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
陈述的阵列。
我认为这个解决方案比一个巨大的正则表达式更具可读性(因此更易于维护)。