0

次のコードを取得するシステムからのレポートを処理しようとしています

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

中括弧{}の間の値を抽出し、変数に保存する必要があります。正規表現などを使用してこれを行う必要があると思いますか?どこから始めたらいいのかわからない!! 私は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

実際の意味に基づいてパラメータに名前を付けます。誰かがここで私を助けてくれますか?スペースに基づいて分割しようとしましたが、他のゴミが発生します。

ポインタ/ヘルプをありがとう!

4

5 に答える 5

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
}

これを頭のてっぺんから書き留めたので、どこかで1つずつエラーが発生する可能性があります。また、エラーチェックを追加して、入力文字列に{と}の両方があることを確認することをお勧めします。

于 2012-12-04T15:47:35.567 に答える
0

このソリューションは、レポートコードをセグメントに分割し、目的の値を配列に格納します。

正規表現は、一度に1つのレポートコードセグメントに一致し、適切な値を「解析されたレポートコード配列」に格納します。

あなたの例が暗示しているように、最初の2つのコードセグメントはその後のものとは異なって扱われます。処理が異なるのは常に最初の2つのセグメントであると想定しました。

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();
}
于 2012-12-05T00:21:00.897 に答える
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\-]*)}

これにより、、、、、、およびとID1呼ばれる名前付きグループが生成さGENれます。QMBI

C#での正規表現の使用の詳細については、 MSDNドキュメントを確認してください。

Regex Heroを使用して、C#の正規表現をすばやくテストできます。

于 2012-12-04T15:54:17.153 に答える
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());
}

私はこれをテストしたばかりで、うまく機能します。

于 2012-12-04T16:03:27.523 に答える
0

使用できますString.Split

string[] parts = s.Split(new string[] {"=[", "] ", " {Q=", " M=", " B=", " I=", "}"},
                         StringSplitOptions.None);
于 2012-12-04T16:14:42.650 に答える