如何使用正则表达式查找特定匹配项并将它们放入字符串数组中?

Posted

技术标签:

【中文标题】如何使用正则表达式查找特定匹配项并将它们放入字符串数组中?【英文标题】:How do I find specific matches using regex and put them in a string array? 【发布时间】:2016-05-05 20:44:22 【问题描述】:

我有一个试图从中提取数据的 html 文件。我正在使用的正则表达式是

"<tr.+?>.+?<td class=\"table_row_col2\"><b>(.+?)&.+?</b>.+?<td class=\"table_row_col5\">(.+?)</td>.+?<td class=\"table_row_col6\">(.+?)</td>.+?</tr>"

它适用于 Python,但不适用于 C#。以下是一些示例数据:

<tr class="table_row" style="background-color: #d3d3d3;">
    <td class="table_row_col1">271</td>
    <td class="table_row_col2"><b>16/09/2015&nbsp;05:28&nbsp;PM</b></font></small></sup></td>
    <td class="table_row_col3"><span style="color:#e30613">14.3</span></td>
    <td class="table_row_col4">-</td>
    <td class="table_row_col5">8</td>
    <td class="table_row_col6">-</td>
    <td class="table_row_col7">-</td>
    <td class="table_row_col8">Before dinner</td>
    <td class="table_row_col9">-</td>
    <td class="table_row_col10">-</td>
    <td class="table_row_col11">-</td>
</tr>

<tr class="table_row" style="background-color: #ffffff;">
    <td class="table_row_col1">272</td>
    <td class="table_row_col2"><b>16/09/2015&nbsp;02:54&nbsp;PM</b></font></small></sup></td>
    <td class="table_row_col3"><span style="color:#e30613">17.6</span></td>
    <td class="table_row_col4">-</td>
    <td class="table_row_col5">20</td>
    <td class="table_row_col6">32</td>
    <td class="table_row_col7">-</td>
    <td class="table_row_col8">Other</td>
    <td class="table_row_col9">-</td>
    <td class="table_row_col10">-</td>
    <td class="table_row_col11">-</td>
</tr>

<tr class="table_row" style="background-color: #d3d3d3;">
    <td class="table_row_col1">273</td>
    <td class="table_row_col2"><b>15/09/2015&nbsp;11:09&nbsp;PM</b></font></small></sup></td>
    <td class="table_row_col3">-</td>
    <td class="table_row_col4">-</td>
    <td class="table_row_col5">-</td>
    <td class="table_row_col6">34</td>
    <td class="table_row_col7">-</td>
    <td class="table_row_col8">Before Bed</td>
    <td class="table_row_col9">-</td>
    <td class="table_row_col10">-</td>
    <td class="table_row_col11">-</td>
</tr>

我正在尝试从 table_row_col2 中提取日期以及从 table_row_col5 和 table_row_col6 中提取数字

【问题讨论】:

我看到你是新来的 - 欢迎来到 SO!您应该知道的第一件事是 HTML 解析最好使用 HTML 解析器完成,而不是使用正则表达式。你考虑过使用一个吗?比如HtmlAgilityPack等?每次有人发布有关使用正则表达式解析 HTML 的问题时,都会共享 RegEx match open tags except XHTML self-contained tags 链接:) 目前在 C# 中返回了什么? 怎么不行?是否有异常,或者没有返回正确的值? 看起来像是 htmlagilitypack.codeplex.com 的工作 C# 正在返回所有的 HTML,不,我没有尝试使用 HTML 解析器,我真的不知道你可以从 HTML 解析器中提取值,我会看看我是否可以使用一个并让它工作。感谢您的回复。 【参考方案1】:

如果你知道 HTML 永远不会改变,你可以像这样添加一个类 Split:

List<string> rows = Split.Extract(htmlString, "class=\"table_row\"", "</tr>");
foreach (string row in rows)

    string col2 = Split.Extract(row, "class=\"table_row_col2\"><b>", "</b>")[0];
    string col5 = Split.Extract(row, "class=\"table_row_col5\">", "</td>")[0];
    string col6 = Split.Extract(row, "class=\"table_row_col6\">", "</td>")[0];

    Console.WriteLine(col2 + ", " + col5 + ", " + col6);

附加类Split

public class Split

    public static List<string> Extract(string source, string splitStart, string splitEnd)
    
        try
        
            var results = new List<string>();

            string[] start = new string[]  splitStart ;
            string[] end = new string[]  splitEnd ;
            string[] temp = source.Split(start, StringSplitOptions.None);

            for (int i = 1; i < temp.Length; i++)
            
                results.Add(temp[i].Split(end, StringSplitOptions.None)[0]);
            

            return results;
        
        catch (Exception e)
        
            throw new Exception(e.Message);
        
    

【讨论】:

甚至比我尝试使用的旧方法更好,它将操作时间从 4.5 秒(或者我的第一个方法大约 4.75 - 5 秒)减少到 ~450 毫秒。你是上帝派来的。非常感谢。

以上是关于如何使用正则表达式查找特定匹配项并将它们放入字符串数组中?的主要内容,如果未能解决你的问题,请参考以下文章

Python - 使用正则表达式查找多个匹配项并将它们打印出来[重复]

查找所有正则表达式匹配的索引?

替换字符串中的重叠匹配项(正则表达式或字符串操作)

使用正则表达式查找两个字符串之间的多个匹配项

正则表达式查找所有匹配项,除了那些被字符包围的匹配项

如何使用正则表达式