2013-12-13 33 views
1

这是RegEx模式的固定代码。这是完全正常工作。我想从XML文件中获得相同的格式。每次我无法编辑代码,所以只有我尝试使用这种类型的方法。读取XML并转换为RegEx字符串数组

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

我打转换为正则表达式[]格式,帮助我。

回答

0

首先,你没有定义方法里面的regPatterns变量,你需要定义它,因为你正在做一个return regPatterns,它需要是同一类型比你的方法(Regex[])的回报。

但是创建一个返回数组的方法是一个相对糟糕的想法(它通过提供实现的细节来打破封装),最好返回,例如,一个IEnumerable,它是“即将到来的”当在.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()); 
        } 
       } 
      } 
     } 
    } 
} 

希望这有助于。

相关问题