2012-12-04 57 views
0

提取数据我试图处理来自系统的报告,给了我下面的代码从纯文本字符串

000=[GEN] OK {Q=1 M=1 B=002 I=3e5e65656-e5dd-45678-b785-a05656569e} 

我需要提取的花括号{之间的值},并将其保存在变量。我假设我需要使用正则表达式或类似的方法来做到这一点?我真的不知道从哪里开始!我使用C#asp.net 4.

我需要以下变量

param1 = 000 
param2 = GEN 
param3 = OK 
param4 = 1 //Q 
param5 = 1 //M 
param6 = 002 //B 
param7 = 3e5e65656-e5dd-45678-b785-a05656569e //I 

我将其命名为根据他们的实际意思PARAMS。任何人都可以在这里帮我吗?我试图根据空格进行拆分,但我得到了其他垃圾!

感谢您的指点/帮助!

+0

split =“?”?它会一直采用这种格式吗? – CR41G14

+0

当你想捕获'GEN','OK'时他们总是会在那里 – Anirudha

回答

0

我会建议这种类型的工作的正则表达式。

var objRegex = new System.Text.RegularExpressions.Regex(@"^(\d+)=\[([A-Z]+)\] ([A-Z]+) \{Q=(\d+) M=(\d+) B=(\d+) I=([a-z0-9\-]+)\}$"); 
var objMatch = objRegex.Match("000=[GEN] OK {Q=1 M=1 B=002 I=3e5e65656-e5dd-45678-b785-a05656569e}"); 
if (objMatch.Success) 
{ 
    Console.WriteLine(objMatch.Groups[1].ToString()); 
    Console.WriteLine(objMatch.Groups[2].ToString()); 
    Console.WriteLine(objMatch.Groups[3].ToString()); 
    Console.WriteLine(objMatch.Groups[4].ToString()); 
    Console.WriteLine(objMatch.Groups[5].ToString()); 
    Console.WriteLine(objMatch.Groups[6].ToString()); 
    Console.WriteLine(objMatch.Groups[7].ToString()); 
} 

我刚刚测试过,它适用于我。

3

如果格式是相当恒定的,你可以使用.NET的字符串处理方法拉出值,沿东西的

string line = 
    "000=[GEN] OK {Q=1 M=1 B=002 I=3e5e65656-e5dd-45678-b785-a05656569e}"; 

int start = line.IndexOf('{'); 
int end = line.IndexOf('}'); 
string variablePart = line.Substring(start + 1, end - start); 
string[] variables = variablePart.Split(' '); 
foreach (string variable in variables) 
{ 
    string[] parts = variable.Split('='); 
    // parts[0] holds the variable name, parts[1] holds the value 
} 

写到这了我的头顶部的线条,所以有可能是某处出现错误的错误。另外,建议增加错误检查,例如以确保输入字符串同时具有{和a}。

+0

+1的非正则表达式解决方案。 – andleer

+0

虽然这是'regex'的一种替代方法,但是您仍然在使它变得复杂......''regex'会以更好的方式做到这一点,而不会混淆代码......这也会导致数组的操作无法执行, t want..he想要存储它在单个变量..非正则表达式的解决方案不建议在这里.. – Anirudha

+0

@ Some1.Kill.The.DJ:也许。这真的取决于要求。 RegEx通常*速度较慢*。将我的代码和hal.stephenk的代码放入一个简单的控制台应用程序中,每运行1,000,000次(仅重复“objRegex.Match”,而不是“新的RegularExpression”),我的代码显示为1.052秒,代码为6.663秒。有时候,这个表现很重要。有时它不会。 RegEx是一种通用的模式匹配解决方案。它几乎不会像用户编写的代码一样快,但它的写入速度会更快。 –

0

使用正则表达式。

快速和肮脏的尝试:

(?<ID1>[0-9]*)=\[(?<GEN>[a-zA-Z]*)\] OK {Q=(?<Q>[0-9]*) M=(?<M>[0-9]*) B=(?<B>[0-9]*) I=(?<I>[a-zA-Z0-9\-]*)} 

这将生成一个名为组,即ID1GENQMBI

有关在C#中使用正则表达式的详细信息,请查阅MSDN docs

您可以使用Regex Hero进行快速C#正则表达式测试。

0

您可以使用String.Split

string[] parts = s.Split(new string[] {"=[", "] ", " {Q=", " M=", " B=", " I=", "}"}, 
         StringSplitOptions.None); 
0

该解决方案打破了你的报告代码为段并存储所需的值到一个数组。

正则表达式一次匹配一个报告代码段,并将相应的值存储在“已解析报告代码数组”中。

正如您的示例所暗示的,前两个代码段的处理方式与之后的不同。我做了这样的假设:它总是前两个不同的处理段。

private static string[] ParseReportCode(string reportCode) { 
    const int FIRST_VALUE_ONLY_SEGMENT = 3; 
    const int GRP_SEGMENT_NAME = 1; 
    const int GRP_SEGMENT_VALUE = 2; 
    Regex reportCodeSegmentPattern = new Regex(@"\s*([^\}\{=\s]+)(?:=\[?([^\s\]\}]+)\]?)?"); 
    Match matchReportCodeSegment = reportCodeSegmentPattern.Match(reportCode); 

    List<string> parsedCodeSegmentElements = new List<string>(); 
    int segmentCount = 0; 
    while (matchReportCodeSegment.Success) { 
     if (++segmentCount < FIRST_VALUE_ONLY_SEGMENT) { 
      string segmentName = matchReportCodeSegment.Groups[GRP_SEGMENT_NAME].Value; 
      parsedCodeSegmentElements.Add(segmentName); 
     } 
     string segmentValue = matchReportCodeSegment.Groups[GRP_SEGMENT_VALUE].Value; 
     if (segmentValue.Length > 0) parsedCodeSegmentElements.Add(segmentValue); 
     matchReportCodeSegment = matchReportCodeSegment.NextMatch(); 
    } 
    return parsedCodeSegmentElements.ToArray(); 
} 
相关问题