12

使用正则表达式,我希望能够获取多个 DIV 标签之间的文本。例如,以下内容:

<div>first html tag</div>
<div>another tag</div>

会输出:

first html tag
another tag

我使用的正则表达式模式只匹配我的最后一个 div 标签并且错过了第一个。代码:

    static void Main(string[] args)
    {
        string input = "<div>This is a test</div><div class=\"something\">This is ANOTHER test</div>";
        string pattern = "(<div.*>)(.*)(<\\/div>)";

        MatchCollection matches = Regex.Matches(input, pattern);
        Console.WriteLine("Matches found: {0}", matches.Count);

        if (matches.Count > 0)
            foreach (Match m in matches)
                Console.WriteLine("Inner DIV: {0}", m.Groups[2]);

        Console.ReadLine();
    }

输出:

找到的匹配项:1

内部 DIV:这是另一个测试

4

7 回答 7

17

用非贪婪匹配替换您的模式

static void Main(string[] args)
{
    string input = "<div>This is a test</div><div class=\"something\">This is ANOTHER test</div>";
    string pattern = "<div.*?>(.*?)<\\/div>";

    MatchCollection matches = Regex.Matches(input, pattern);
    Console.WriteLine("Matches found: {0}", matches.Count);

    if (matches.Count > 0)
        foreach (Match m in matches)
            Console.WriteLine("Inner DIV: {0}", m.Groups[1]);

    Console.ReadLine();
}
于 2013-04-14T23:19:07.367 回答
10

正如其他人没有提到的那样HTML tags with attributes,这是我的解决方案:

// <TAG(.*?)>(.*?)</TAG>
// Example
var regex = new System.Text.RegularExpressions.Regex("<h1(.*?)>(.*?)</h1>");
var m = regex.Match("Hello <h1 style='color: red;'>World</h1> !!");
Console.Write(m.Groups[2].Value); // will print -> World
于 2016-10-01T11:58:41.347 回答
1

我认为这段代码应该可以工作:

string htmlSource = "<div>first html tag</div><div>another tag</div>";
string pattern = @"<div[^>]*?>(.*?)</div>";
MatchCollection matches = Regex.Matches(htmlSource, pattern, RegexOptions.IgnoreCase | RegexOptions.Singleline);
ArrayList l = new ArrayList();
foreach (Match match in matches)
 {
   l.Add(match.Groups[1].Value);
 }
于 2014-07-15T03:12:09.410 回答
1

您是否查看过Html 敏捷包(请参阅https://stackoverflow.com/a/857926/618649)?

CsQuery看起来也非常有用(基本上使用 CSS 选择器样式的语法来获取元素)。请参阅https://stackoverflow.com/a/11090816/618649

CsQuery 基本上意味着“C# 的 jQuery”,这几乎是我用来查找它的确切搜索条件。

如果您可以在 Web 浏览器中执行此操作,您可以轻松地使用 jQuery,使用类似于以下的语法$("div").each(function(idx){ alert( idx + ": " + $(this).text()); }(只是您显然会将结果输出到日志或屏幕,或使用它进行 Web 服务调用,或任何您需要的做它)。

于 2013-04-15T01:55:31.380 回答
1

首先请记住,在 HTML 文件中,您将有一个换行符(“\n”),您没有将它包含在您用来检查正则表达式的字符串中。

其次,带上你的正则表达式:

((<div.*>)(.*)(<\\/div>))+ //This Regex will look for any amount of div tags, but it must see at least one div tag.

((<div.*>)(.*)(<\\/div>))* //This regex will look for any amount of div tags, and it will not complain if there are no results at all.

也是寻找此类信息的好地方:

http://www.regular-expressions.info/reference.html

http://www.regular-expressions.info/refadv.html

梅曼

于 2013-04-14T23:20:19.610 回答
1

简短的版本是您无法在所有情况下都正确执行此操作。总会有一些有效的 HTML 情况,正则表达式无法提取您想要的信息。

原因是因为 HTML 是一种上下文无关语法,它是一个比正则表达式更复杂的类。

这是一个例子——如果你有多个堆叠的 div 怎么办?

<div><div>stuff</div><div>stuff2</div></div>

列为其他答案的正则表达式将抓住:

<div><div>stuff</div>
<div>stuff</div>
<div>stuff</div><div>stuff2</div>
<div>stuff</div><div>stuff2</div></div>
<div>stuff2</div>
<div>stuff2</div></div>

因为这就是正则表达式在尝试解析 HTML 时所做的事情。

您无法编写一个能够理解如何解释所有情况的正则表达式,因为正则表达式无法做到这一点。如果您正在处理一组非常具体的受约束的 HTML,这可能是可能的,但您应该牢记这一事实。

更多信息:https ://stackoverflow.com/a/1732454/2022565

于 2013-04-14T23:28:30.283 回答
1

我希望下面的正则表达式可以工作:

<div.*?>(.*?)<*.div>

你会得到你想要的输出

这是一个测试 这是另一个测试

于 2020-02-06T06:30:59.937 回答