-4

我有一个 HTML 页面,它只有一个标签,<table>但有很多标签。<tr><td>

例子:

<tr attributes >
    <td>Name1</td>
    <td>some text</td>
    <td>some text</td>
</tr>                                                            1.
<tr>
    <td>some text</td>
    <td>--------</td>
    <td>some text</td>
    <td>some text</td>
</tr>
<tr>
    <td>Total</td>
    <td>--------</td>
    <td>1989</td>
    <td>some text</td>
</tr>
------------------------------------------------------------------------------
<tr attributes >
    <td>Name2</td>
    <td>some text</td>
    <td>some text</td>
</tr>
<tr>
    <td>some text</td>
    <td>--------</td>
    <td>some text</td>
    <td>some text</td>                                            
</tr>
<tr>
    <td>some text</td>
    <td>--------</td>
    <td>some text</td>
    <td>some text</td>
</tr>
<tr>
    <td>Total</td>
    <td>--------</td>
    <td>1979</td>
    <td>some text</td>
</tr>
------------------------------------------------------------------------------
<tr attributes >
    <td>Name3</td>
    <td>some text</td>
    <td>some text</td>
</tr>                                                                  2.
<tr>
    <td>some text</td>
    <td>--------</td>
    <td>some text</td>
    <td>some text</td>
</tr>
<tr>
    <td>Total</td>
    <td>--------</td>
    <td>1089</td>
    <td>some text</td>
</tr>

现在假设我想要NAME1和以下TOTALNAME3和以下TOTAL之间的行。

这之间可以有任意数量的行和列...

行和列的大小不固定。

所以输出应该包括1.2.

4

2 回答 2

0

如果您想让组将 texte 与 html 分开,请使用这个:

<td>Name(1|3)</td>((\s*<td>([^<]+)</td>\s*)+</tr>(.*?)<tr>)+?\s*<td>Total</td>

您必须添加选项“s”(全点模式)

于 2013-05-29T13:22:15.370 回答
0

当他们说你应该使用解析器时,我同意其他人的观点。该解决方案将比正则表达式更强大。但是,如果您知道运行正则表达式所针对的 HTML 不会有太大变化,那么正则表达式方法就可以工作。知道即使是对 HTML 的微小更改也可能导致此解决方案稍后失败。例如,如果您将属性添加到任何内部行,则此正则表达式将找不到匹配项。正则表达式也可以在这种情况下工作,但是它变得更加复杂和难以阅读。

此正则表达式适用于您在问题中提供的示例 HTML。使用捕获组 1 仅获取内部行,

<tr\s+[^>]+>\s*<td>Name(?:1|3)</td>(?:\s*<td>[\w\s-]+</td>)+\s*</tr>((?:\s*<tr>(?:\s*<td>[\w\s-]+</td>)+\s*</tr>)+?)\s*<tr>\s*<td>Total</td>(?:\s*<td>[\w\s-]+</td>)+\s*</tr>

这是正则表达式的粗略细分:

#Matche the first row.
<tr\s+[^>]+>                    #Match the opening TR tag, allow for any attributes found inside the tag.
\s*<td>Name(?:1|3)</td>         #Match the first cell. Only allow its contents to be "Name1" or "Name3".
(?:\s*<td>[\w\s-]+</td>)+       #Match all other cells in this row.
\s*</tr>                        #Match the end of the row.

#Match all rows between the first and last row.
(?:
    \s*<tr>                         #Match the beginning of an inner row.
        (?:\s*<td>[\w\s-]+</td>)+   #Match all the cells in the current row.
    \s*</tr>                        #Match the end of the current row.
)+?

#Match the last row.
\s*<tr>                         #Match the beginning of the last row.
\s*<td>Total</td>               #Match the first cell. Only allow its contents to be "Total".
(?:\s*<td>[\w\s-]+</td>)        #Match all other cells in this row.
+\s*</tr>                       #Match the end of the last row.
于 2013-05-29T18:25:17.137 回答