【问题标题】:Regex looping through a foreach to find a certain pattern正则表达式循环遍历 foreach 以找到特定模式
【发布时间】:2016-11-29 23:32:33
【问题描述】:

我正在使用 openXML,我正在尝试遍历一个 excel 文件以查看是否有任何内容与特定模式匹配。我的正则表达式模式是休闲@"(?<!\w)#\w+"。这应该返回以“#”开头的任何内容。在我的 excel 工作簿 xml 中有许多以“#”开头的已定义名称,例如<definedName name="_KEY" hidden="1" localSheetId="3">#REF!</definedName>。但是,当我尝试找到定义的名称时,我的计数返回零。

我的代码是休闲的

首先我浏览文件并选择文件。我已经确保这可以完美运行。

然后我尝试对每场比赛进行计数和循环,这就是我遇到问题的地方。我想我搞砸了我的 foreach 循环,我真的需要一些指导。

    var spreadsheet = DocumentFormat.OpenXml.Packaging.SpreadsheetDocument.Open(filePath, false);
    var workbook = spreadsheet.WorkbookPart;
    var names = workbook.Workbook.DefinedNames;




    //result.InactiveNamedRangeCount = names.Where(n => n.InnerText.Contains(pattern)).Count();

    foreach (Match match in Regex.Matches(names.ToString(), @"(?<!\w)#\w+"))
    {
            result.InactiveNamedRangeCount = names.Where(n => n.InnerText.Contains(match.ToString())).Count();

    }

【问题讨论】:

  • 您永远不应该使用正则表达式来解析 xml 或 html。使用正确的工具。您可以使用 System.Xml 库或 System.Xml.Linq 库。

标签: c# xml


【解决方案1】:

检查 names.ToString() 返回的内容,你不应该在上面运行正则表达式。

要获得与您的模式匹配的 DefinedNames 的数量,您可以使用:

names.Count(n => Regex.IsMatch(n.InnerText, @"(?<!\w)#\w+"));

【讨论】:

  • 我应该将它添加到我的 foreach 循环中还是需要摆脱我的 foreach 循环?
  • 嘿,我编辑了答案,它现在应该反映了您的需求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-25
  • 2018-04-26
  • 1970-01-01
  • 2012-05-06
相关资源
最近更新 更多