1

这是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>

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

我需要解析出Department、Function、Process、Procedure。目标、何时执行、谁将执行、完成时间、技术要求、源文档、代码和定义、风险。

然后我需要从 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);
4

3 回答 3

1

这个正则表达式对我的输入数据很好

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

结果是多个匹配,每个匹配有 2 个组 - 第一个是键,第二个是值。我只处理了两个案例,但您可以轻松添加其余案例。

要删除由此解析的信息,您可以使用此正则表达式执行Regex.Replace

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

和替换字符串为

${开始}${结束}

遗漏价值。

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

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

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

于 2013-08-22T19:53:09.463 回答
0

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

于 2013-08-22T18:20:00.893 回答
0

对于 HTML,您需要一个 HTML 解析器。试试HTML Agility PackCsQuery

正则表达式可以处理与 HTML 的简单匹配,但对于分层结构来说还不够,而且查询的精确度也会降低。

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

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

于 2013-08-22T19:21:18.617 回答