早上好
我正在尝试获得一个必须有一个或多个表格单元格(TD)的表格行(TR):
有这个字符串
<TABLE>
<TR valign="top">
<TH>First</TH>
<TH>2nd</TH>
<TH>3rd</TH>
<TH>4th</TH>
</TR>
<TR valign="top">
<TD width="15%">Michael Jackson</TD>
<TD width="5%">Cramberries</TD>
<TD width="25%">Pixies</TD>
<TD width="45%">The Ramones</TD>
</TR>
</TABLE>
我想得到:
<TR valign="top">
<TD width="15%">Michael Jackson</TD>
<TD width="5%">Cramberries</TD>
<TD width="25%">Pixies</TD>
<TD width="45%">The Ramones</TD>
</TR>
用嵌套的TD提取一个或多个TR的最佳模式是什么?
答案 0 :(得分:1)
<tr(\s[^>*)?>.*?<td(\s[^>]*)?>.*?</tr(\s[^>]*)?>
应该有效,但设置不区分大小写和多行标记。
但我完全赞同Jan上面的评论。使用html解析器,它将更加强大和可读。
答案 1 :(得分:1)
这个正在运作
Regex.Matches(sourceHtmlString, @"(?<1><TR[^>]*>\s*<td.*?</tr>)",
RegexOptions.Singleline | RegexOptions.IgnoreCase)
答案 2 :(得分:0)
这到底在哪里?如果你在浏览器中运行它,在Javascript中,有比正则表达更好的方法(例如tr上的jQuery选择器:has(td)作为随机例子)
如果您在服务器端环境中运行它,例如PHP,正则表达式可以工作。
类似于:(] +&gt;。?)
原因我建议与其他任何东西相反 - 你想获得整个内容,所以将整个内容包装在括号中,TR和TD可能有也可能没有宽度,从来没有伤害到确定这些东西
。*?在大多数regexp引擎中构造应该是非贪婪的,所以匹配符合的最小字符串 - 这应该防止......匹配。仍然需要多线和不区分大小写,通常是m和i,也需要设置。 (但我没有测试过这个)
但正如罗伯特指出的那样,在服务器端,一个合适的HTML解析器会更好,DOM或XML扩展应该能够处理它。
答案 3 :(得分:-1)
这不是正则表达式会做的事情。例如,尝试将文字与<tr[^>]*>.*?<td[^>]*>.*?</tr>
匹配将匹配<th>
行和第一个<td>
行。您应首先匹配行,然后尝试搜索<td>
的每一行。
或者,更好的是,使用HTML解析器。 HTML不是regular language,并且不能用正则表达式真正解析。