C# 从纯文本字符串中提取数据

C# 从纯文本字符串中提取数据,c#,regex,string,string-matching,C#,Regex,String,String Matching,我正在尝试处理来自系统的报告,该系统提供以下代码 000=[GEN] OK {Q=1 M=1 B=002 I=3e5e65656-e5dd-45678-b785-a05656569e} 我需要提取花括号{}之间的值,并将它们保存到变量中。我想我需要使用regex或类似的工具来完成这项工作?我真的不知道从哪里开始!!我正在使用c#asp.NET4 我需要以下变量 param1 = 000 param2 = GEN param3 = OK param4 = 1 //Q param5 = 1 //M

我正在尝试处理来自系统的报告,该系统提供以下代码

000=[GEN] OK {Q=1 M=1 B=002 I=3e5e65656-e5dd-45678-b785-a05656569e}
我需要提取花括号{}之间的值,并将它们保存到变量中。我想我需要使用regex或类似的工具来完成这项工作?我真的不知道从哪里开始!!我正在使用c#asp.NET4

我需要以下变量

param1 = 000
param2 = GEN
param3 = OK
param4 = 1 //Q
param5 = 1 //M
param6 = 002 //B
param7 = 3e5e65656-e5dd-45678-b785-a05656569e //I
我将根据参数的实际含义来命名它们。有人能帮我吗?我尝试过根据空格进行分割,但是我得到了另一个垃圾


谢谢你的指点/帮助

如果格式非常恒定,您可以使用.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
}

在我的头顶上写下了这个,所以可能在某个地方有一个错误。此外,建议添加错误检查,例如,确保输入字符串同时包含{和}。

如果格式非常恒定,您可以使用.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
}

在我的头顶上写下了这个,所以可能在某个地方有一个错误。此外,建议添加错误检查,例如确保输入字符串同时包含{和}。

使用正则表达式

快速而肮脏的尝试:

(?<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\-]*)}
(?[0-9]*)=\[(?[a-zA-Z]*)\]好的{Q=(?[0-9]*)M=(?[0-9]*)B=(?[0-9]*)I=(?[a-zA-Z0-9\-]*))
这将生成名为
ID1
GEN
Q
M
B
I
的命名组

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


可以用于快速C#regex测试。

使用正则表达式

快速而肮脏的尝试:

(?<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\-]*)}
(?[0-9]*)=\[(?[a-zA-Z]*)\]好的{Q=(?[0-9]*)M=(?[0-9]*)B=(?[0-9]*)I=(?[a-zA-Z0-9\-]*))
这将生成名为
ID1
GEN
Q
M
B
I
的命名组

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


您可以用于快速C#regex测试。

我建议使用正则表达式进行此类工作

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

我刚刚对此进行了测试,它对我很有效。

我建议为这类工作使用正则表达式

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

我刚刚测试过这个,它对我很有效。

您可以使用
String.Split

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

您可以使用
String.Split

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

此解决方案将报表代码分成多个段,并将所需的值存储到数组中

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

正如您的示例所暗示的,前两个代码段的处理方式与之后的代码段不同。我假设前两个部分的处理方式总是不同的

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();
}
私有静态字符串[]ParseReportCode(字符串报告代码){
const int FIRST_VALUE_ONLY_段=3;
const int GRP_SEGMENT_NAME=1;
常数int GRP_段_值=2;
正则表达式reportCodeSegmentPattern=新正则表达式(@“\s*([^\}\{=\s]+)(?:=\[?([^\s\]\}]+)\]?)”;
Match matchReportCodeSegment=reportCodeSegmentPattern.Match(reportCode);
List parsedCodeSegmentElements=新列表();
int段计数=0;
while(matchReportCodeSegment.Success){
如果(++segmentCount<第一个\u值\u仅\u段){
string segmentName=matchReportCodeSegment.Groups[GRP\U SEGMENT\U NAME]。值;
parsedCodeSegmentElements.Add(段名称);
}
string segmentValue=matchReportCodeSegment.Groups[GRP\U SEGMENT\U VALUE].VALUE;
如果(segmentValue.Length>0)parsedCodeSegmentElements.Add(segmentValue);
matchReportCodeSegment=matchReportCodeSegment.NextMatch();
}
返回parsedCodeSegmentElements.ToArray();
}

此解决方案将报表代码分成多个段,并将所需的值存储到数组中

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

正如您的示例所暗示的,前两个代码段的处理方式与之后的代码段不同。我假设前两个部分的处理方式总是不同的

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();
}
私有静态字符串[]ParseReportCode(字符串报告代码){
const int FIRST_VALUE_ONLY_段=3;
const int GRP_SEGMENT_NAME=1;
常数int GRP_段_值=2;
正则表达式reportCodeSegmentPattern=新正则表达式(@“\s*([^\}\{=\s]+)(?:=\[?([^\s\]\}]+)\]?)”;
Match matchReportCodeSegment=reportCodeSegmentPattern.Match(reportCode);
List parsedCodeSegmentElements=新列表();
int段计数=0;
while(matchReportCodeSegment.Success){
如果(++segmentCount<第一个\u值\u仅\u段){
string segmentName=matchReportCodeSegment.Groups[GRP\U SEGMENT\U NAME]。值;
parsedCodeSegmentElements.Add(段名称);
}
string segmentValue=matchReportCodeSegment.Groups[GRP\U SEGMENT\U VALUE].VALUE;
如果(segmentValue.Length>0)parsedCodeSegmentElements.Add(segmentValue);
matchReportCodeSegment=matchReportCodeSegment.NextMatch();
}
返回parsedCodeSegmentElements.ToArray();
}

在“=”上拆分?它是否始终采用这种格式?您是否希望捕获
GEN
OK
,当它们总是在“=”上拆分时?它是否始终采用这种格式?是否要捕获
GEN
OK
当它们总是在那里时,虽然这是
regex
的一种替代方法,但您仍然在使其变得复杂。
regex
将以更好的方式执行,而不会使代码混乱…这也将导致op不想要的数组。.他想将其存储在单个变量中。.非regex这里不推荐使用解决方案。…@Some1.Kill.The.DJ:可能吧。这真的取决于