读取XML并转换为RegEx字符串数组

时间:2013-12-13 13:18:15

标签: c# xml regex

这是RegEx Pattern的固定代码。这完全正常。我想从XML文件中获得相同的格式。每次我都无法编辑代码,所以只有我尝试使用这种方法。

Regex[] regPatterns = { new Regex(@"\[(.*?)\]"),
                        new Regex(@"\'_(.*?)\'") 
                      };

示例XML就在这里

<?xml version="1.0" encoding="utf-8" ?>
    <RegExPattern>
        <Pattern name="DateFormat">
            @"\[(.*?)\]"
        </Pattern>
        <Pattern name="NumberFormat">
            @"\d+"
        </Pattern>
    </RegExPattern>

示例C#代码在这里

regPatterns = ReadRegExPatterns();

private Regex[] ReadRegExPatterns()
    {
        using (XmlReader reader = XmlReader.Create("RegExFormats.xml"))
            {
                while (reader.Read())
                {
                    if (reader.IsStartElement())
                    {
                        switch (reader.Name)
                        {
                            case "Pattern":
                                if (reader.Read())
                                {
                                    //Error Line
                                    regPatterns = new Regex(reader.Value.Trim());
                                }
                                break;
                        }
                    }
                }
            }

        return regPatterns;
    }

我转而使用regex []格式,帮助我。

1 个答案:

答案 0 :(得分:0)

首先,你没有在方法中定义regPatterns变量,你需要定义它,并且因为你正在做return regPatterns,它需要与返回相同的类型您的方法(Regex[])。

但是创建一个返回数组的方法是一个相对糟糕的想法(它通过提供实现的细节来破坏封装),最好返回一个IEnumerable,它就是“to-go”类在.Net中返回一些东西的时候。

添加了奖励,它可以使用yield关键字轻松实现您的方法:

private IEnumerable<Regex> ReadRegExPatterns()
{
    using (XmlReader reader = XmlReader.Create("RegExFormats.xml"))
    {
        while (reader.Read())
        {
            if (reader.IsStartElement())
            {
                if (reader.Name == "Pattern")
                {
                    if (reader.Read())
                    {
                        yield return new Regex(reader.Value.Trim());
                    }
                }
            }
        }
    }
}

希望这有帮助。