string input = "<table>
<tr>
<td>Text A</td>
</tr>
<tr>
<td>
<table> <!-- Notice this is an inner scope table -->
<tr>
<td>Text B</td>
</tr>
</table>
</td>
</tr>
</table>
<table>
<tr>
<td>
<table> <!-- Notice this is an inner scope table -->
<tr>
<td>Text C</td>
</tr>
</table>
</td>
</tr>
</table>
<table>
<tr>
<td>Text D</td>
</tr>
</table>"我有一系列上述字符串格式的表格。
我想提取出所有<tr>的第一级内容,其中预期提取的内容是:
Text A
<table>
<tr>
<td>Text B</td>
</tr>
</table>
<table>
<tr>
<td>Text C</td>
</tr>
</table>
Text D我有以下正则表达式,它描述了我正在尝试做的事情
var regexTableRow = new Regex("<tr><td>(.*?)</td></tr>");
var regexMatches = regexTableRow.Matches(htmlInput);
var tableRows = new List<string>();
foreach (Match match in regexMatches)
{
// Get a row of <tr></tr> out
var value = match.Value;
tableRows.Add(value);
}正则表达式失败的地方是它从内部表而不是外部表提取<tr>。如何让正则表达式在提取过程中只关注外部表?
谢谢。
编辑-谢谢,我将使用HtmlAgilityPack。下面的代码也面临着类似的问题:
var htmlDocument = new HtmlDocument();
htmlDocument.LoadHtml(htmlInput);
var output = htmlDocument.DocumentNode
.SelectNodes("table/tr");其中内部表被提取而不是外部表被提取。
发布于 2019-10-14 05:04:03
使用正则表达式来实现这一点是不受欢迎的,但如果必须这样做,您可以定义一些边界,例如:
(?<=<table>)\s*<tr>\s*<td>([a-z0-9 ]*)<\/td>\s*<\/tr>否则,事情就会变得相当复杂。
测试
using System;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
string pattern = @"(?<=<table>)\s*<tr>\s*<td>([a-z0-9 ]*)<\/td>\s*<\/tr>";
string input = @"<table>
<tr>
<td>Text A</td>
</tr>
<tr>
<td>
<table> <!-- Notice this is an inner scope table -->
<tr>
<td>Text B</td>
</tr>
</table>
</td>
</tr>
</table>
<table>
<tr>
<td>
<table> <!-- Notice this is an inner scope table -->
<tr>
<td>Text C</td>
</tr>
</table>
</td>
</tr>
</table>
<table>
<tr>
<td>Text D</td>
</tr>
</table>";
RegexOptions options = RegexOptions.Singleline | RegexOptions.IgnoreCase;
foreach (Match m in Regex.Matches(input, pattern, options))
{
Console.WriteLine("'{0}' found at index {1}.", m.Value, m.Index);
}
}
}如果您希望简化/修改/探索该表达式,可以在regex101.com的右上角面板中对其进行解释。如果您愿意,您还可以在this link中观看它如何与一些样本输入进行匹配。
https://stackoverflow.com/questions/58367709
复制相似问题