首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Regex -提取外部作用域匹配值<table><table></table></table>

Regex -提取外部作用域匹配值<table><table></table></table>
EN

Stack Overflow用户
提问于 2019-10-14 04:56:19
回答 1查看 103关注 0票数 1
代码语言:javascript
复制
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>的第一级内容,其中预期提取的内容是:

代码语言:javascript
复制
Text A

<table>
    <tr>
        <td>Text B</td>
    </tr>
</table>

<table>
    <tr>
        <td>Text C</td>
    </tr>
</table>

Text D

我有以下正则表达式,它描述了我正在尝试做的事情

代码语言:javascript
复制
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。下面的代码也面临着类似的问题:

代码语言:javascript
复制
var htmlDocument = new HtmlDocument();
            htmlDocument.LoadHtml(htmlInput);

            var output = htmlDocument.DocumentNode
                .SelectNodes("table/tr");

其中内部表被提取而不是外部表被提取。

EN

回答 1

Stack Overflow用户

发布于 2019-10-14 05:04:03

使用正则表达式来实现这一点是不受欢迎的,但如果必须这样做,您可以定义一些边界,例如:

代码语言:javascript
复制
(?<=<table>)\s*<tr>\s*<td>([a-z0-9 ]*)<\/td>\s*<\/tr>

否则,事情就会变得相当复杂。

测试

代码语言:javascript
复制
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中观看它如何与一些样本输入进行匹配。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58367709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档