通过LINQ中的模式查找动态单词



以下是html如何启动

业务文档

<p>Some company</p>
<p>
<p>DEPARTMENT: Legal Process</p>
<p>FUNCTION: Computer Department</p>
<p>PROCESS: Process Server</p>
<p>PROCEDURE: ABC Process Server</p>
<p>OWNER: Some User</p>
<p>REVISION DATE: 06/10/2013</p>
<p>
<p>OBJECTIVE: To ensure that the process server receive their invoices the following day.</p>
<p>
<p>WHEN TO PERFORM: Daily</p>
<p>
<p>WHO WILL PERFORM? Computer Team</p>
<p>
<p>TIME TO COMPLETE: 5 minutes</p>
<p>
<p>TECHNOLOGY REQUIREMENT(S): </p>
<p>
<p>SOURCE DOCUMENT(S): N/A</p>
<p>
<p>CODES AND DEFINITIONS: N/A</p>
<p>
<table border="1">
  <tr>
    <td>
      <p>KPI&rsquo;s: </p>
    </td>
  </tr>
</table>
<p>
<table border="1">
  <tr>
    <td>
      <p>RISKS:  </p>
    </td>
  </tr>
</table>

之后是一大堆的文字。我需要做的是从上面我需要解析出特定的数据。

我需要分析出部门、职能、流程和程序。目标,何时执行,谁将执行,完成时间,技术要求,源文件,代码和定义,风险。

然后,我需要从Html列中删除这些信息,同时保留所有其他信息。这在LINQ中可能吗?

这是我正在使用的LINQ查询:

var result = (from d in IPACS_Documents
join dp in IPACS_ProcedureDocs on d.DocumentID equals dp.DocumentID
join p in IPACS_Procedures on dp.ProcedureID equals p.ProcedureID
where d.DocumentID == 4
&& d.DateDeleted == null
select d.Html);
Console.WriteLine(result);

这个正则表达式在您的输入数据上运行得很好

(DEPARTMENT|FUNCTION|OBJECTIVE):s*(?<value>.+)<

结果是多个Matches,每个Matches有两组——第一组是键,第二组是值。我只处理了两个案例,但你可以很容易地添加其余的。

要删除由此解析的信息,您可以执行Regex。替换为此Regex

(?\(部门|职能|目标):\s*)(?.+)(?\)

和替换字符串作为

${start}${end}

忽略了价值。

在代码中,这看起来有点像这样(在记事本++中快速键入-可能有小错误)。

private static readonly ParseDocRegex = new Regex(@"(?<start><p>(?<name>DEPARTMENT|FUNCTION|OBJECTIVE):s*)(?<value>.+)(?<end></p>)", RegexOptions.ExplicitCaptured | RegexOptions.Compiled);

from html in result
    let matches = findValuesRegex.Match(html)
    where matches.Success
    select new
    {
        namesAndValues = from m in matches.AsType<Match>() 
        select new KeyValuePair<string, string>(m.Groups["name"].Value, m.Groups["value"].Value),
        strippedHtml = ParseDocRegex.Replace(html, "${start}${end}")
    };

这应该会给你想要的输出。

它可以用许多LINQ语句来完成,但使用正则表达式只需要几行代码。

对于HTML,您需要一个HTML解析器。尝试HTML敏捷包或CsQuery。

正则表达式可以处理针对HTML的简单匹配,但不足以用于层次结构,查询也不那么精确。

任何HTML提取都将是脆弱的,因为HTML的结构收费。HTML是一种表示格式,创建者很少关心机器解释。至少使用解析器,您将获得表示标记的准确模型(假设它是有效的HTML)。您还可以将实体转换为字符,并能够提取元素的所有子体文本,而无需使用粗体或斜体等内部标记元素。

您只需添加引用就可以在LINQPad中使用任意程序集,对于基于表达式的脚本,您可以自动导入指定的命名空间。

最新更新