1

かっこをキャプチャするのに問題があります。

この形式のデータを含む大きなファイルがあります。

I.u[12] = {n: "name1",...};
I.u[123] = {n: "name2",...};
I.u[1234] = {n: "name3",...};

ID(ここ、、 )を指定すると、ファイルから名前(ここ、、、)name1を取得するのに役立つシステムを作成したいと思います。私は次のコードを持っています:name2name3121231234

    public static string GetItemName(int id)
    {
        Regex regex = new Regex(@"^I.u\["+id+@"\]\s=\s{n:\s(.+),.+};$");
        Match m= GetMatch(regex,filepath);
        if(m.Success) return m.Groups[0].Value;
        else return "unavailable";
    }

    public static Match GetMatch(Regex regex, string filePath)
    {
        Match res = null;
        using (StreamReader r = new StreamReader(filePath))
        {
            string line;
            while ((line = r.ReadLine()) != null)
            {
                res = regex.Match(line);
                if (res.Success) break;
            }
        }
        return res;
    }

正規表現はファイル内で正しい行を見つけますが、なぜそれが私が望むように名前を抽出しないのか本当にわかりません、そして、

if(m.Success) return m.Groups[0].Value;

m.Groups[0]名前ではなくファイルの行全体が返されます...に変更しても、多くのことを試しましたm.Groups[1]が、機能しませんでした。

私は今、成功せずに一瞬検索しました。何が悪いのか分かりますか?

4

3 に答える 3

3

更新された質問に基づいて、貪欲な数量詞を使用していることがわかります.+。これは可能な限り一致します。必要なだけ一致するパッシブ修飾子が必要です。.+?

これを試して:

Regex regex = new Regex(@"^I.u\["+id+@"\]\s=\s\{n:\s(?<Name>.+?),.+\};$", RegexOptions.Multiline);

それで:

if(m.Success) return m.Groups["Name"].Value;
于 2013-01-16T17:02:41.537 に答える
2

他の人が指摘しているように、これは:

if(m.Success) return m.Groups[0].Value;

する必要があります:

if(m.Success) return m.Groups[1].Value;

ただし、これは"name1"引用符を含めて返されます。正規表現パターンを次のように修正してみてください。

@"^I.u\["+id+@"\]\s=\s{n:\s""(.+)"",.+};$"

からの引用を除外しますm.Groups[1].Value

于 2013-01-16T17:04:34.463 に答える
0

あなたが間違ったグループ番号を参照しているので..それはすべきではあり1ません0

グループ0には、グループの数に関係なく、常に一致全体が含まれます。

また、正規表現は

^I.u\["+id+@"\]\s*=\s*{n:\s*""(.+)"",.+};$
于 2013-01-16T17:01:01.217 に答える