1

このクラスは例外をスローしています。正確な行番号は表示されませんが、静的コンストラクターで発生しているように聞こえます。

static class _selectors
{
    public static string[] order = new[] { "ID", "NAME", "TAG" };
    public static Dictionary<string, Regex> match = new Dictionary<string, Regex> {
        { "ID", new Regex(@"#((?:[\w\u00c0-\uFFFF-]|\\.)+)") },
        { "CLASS", new Regex(@"\.((?:[\w\u00c0-\uFFFF-]|\\.)+)") },
        { "NAME", new Regex(@"\[name=['""]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['""]*\]") },
        { "ATTR", new Regex(@"\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['""]*)(.*?)\3|)\s*\]") },
        { "TAG", new Regex(@"^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)") },
        { "CHILD", new Regex(@":(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?") },
        { "POS", new Regex(@":(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)") },
        { "PSEUDO", new Regex(@":((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['""]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?") }
    };
    public static Dictionary<string, Action<HashSet<XmlNode>, string>> relative = new Dictionary<string, Action<HashSet<XmlNode>, string>> {
        { "+", (checkSet, part) => {
        }}
    };
    public static Dictionary<string, Regex> leftMatch = new Dictionary<string, Regex>();
    public static Regex origPOS = match["POS"];

    static _selectors()
    {
        foreach (var type in match.Keys)
        {
            _selectors.match[type] = new Regex(match[type].ToString() + @"(?![^\[]*\])(?![^\(]*\))");
            _selectors.leftMatch[type] = new Regex(@"(^(?:.|\r|\n)*?)" + Regex.Replace(match[type].ToString(), @"\\(\d+)", (m) =>
                @"\" + (m.Index + 1)));
        }
    }
}

c'tor でこれらの値を変更できないのはなぜですか?

4

3 に答える 3

2

内部例外を表示すると、次のように記載されていることがわかります

コレクションが変更されました。列挙操作が実行されない場合があります。

これは、ループしているコレクションを変更していることを意味しますが、これは許可されていません。

むしろ、コンストラクターを次のように変更します

static _selectors()
{
    List<string> keys = match.Keys.ToList();
    for (int iKey = 0; iKey < keys.Count; iKey++)
    {
        var type = keys[iKey];
        _selectors.match[type] = new Regex(match[type].ToString() + @"(?![^\[]*\])(?![^\(]*\))");
        _selectors.leftMatch[type] = new Regex(@"(^(?:.|\r|\n)*?)" + Regex.Replace(match[type].ToString(), @"\\(\d+)", (m) =>
            @"\" + (m.Index + 1)));
    }
}
于 2010-09-23T11:47:24.390 に答える
1

簡単な診断アプローチ: すべてのコードを通常のメソッドに移動し、その方法でスローされている例外を見つけます。または、デバッガーで実行するだけです-例外がスローされると壊れるはずです。

悪い正規表現かそのようなものになると思います。

個人的には、これは静的コンストラクターのロジックが多すぎると思いますが、それは少し別の問題です...ここでは初期化の順序にも依存していることに注意してください。

public static Regex origPOS = match["POS"];

現時点では問題ないことが保証されていますが、非常に脆弱です

于 2010-09-23T11:45:04.317 に答える
1

列挙中にコレクションを変更しています。そんなことはできません。簡単な修正は、キーを別のコレクションに移動して、次のように列挙することです。

static _selectors()
{
    foreach (var type in match.Keys.ToArray())
    {

また、内部例外をチェックしていれば、それが事実であることがわかります。

于 2010-09-23T11:48:11.440 に答える