【问题标题】:Regex get string and catch until end正则表达式获取字符串并捕获直到结束
【发布时间】:2015-08-29 21:21:45
【问题描述】:

我的文本如下所示:

<a href="/track/867059" itemprop="url" class="evt-click" data-target="track">
                            <span itemprop="name">Feel So Good </span>
                        </a>
                        <span class="featuring" data-target="featuring"></span>
                    </div>
                </td>
                <td class="artist">
                    <div class="wrapper ellipsis">
                        <a class="evt-click" href="/artist/7" data-target="artist" itemprop="byArtist">Jamiroquai</a>
                    </div>
                </td>
                <td class="album">
                    <div class="wrapper ellipsis">
                        <a class="evt-click" href="/album/98952" itemprop="inAlbum" data-target="album" >A Funk Odyssey</a>
                    </div>
                </td>
                <td class="length">
                    <div class="wrapper" data-target="length"></div>
                </td>
                <td class="popularity" title="By popularity:7.85 / 10">
                    <span class="note" data-target="note"></span>
                </td>
                <td class="added">
                    <div class="wrapper ellipsis timestamp" data-target="added">
                        05:23

我想在文本末尾获得05:23。 我尝试了这两种模式,但都失败了。

(\d{2}:\d{2})$
data-target=\"added\">(.*?)$

正确的模式是什么?

【问题讨论】:

  • 正确的模式是首先阅读this,然后使用this
  • 我知道,但我在 WP8.1 上,大多数 html 解析器不兼容。 + 这是一个我必须处理的文件,所以源实际上并没有改变。
  • most of the html parsers aren't compatible HtmlAgilityPack 怎么样?你试过了吗?如果它在支持 WP7 时不能与 WP8.1 一起使用,我会觉得很奇怪 :)
  • 我已经试过了。但是 Nuget 引用了 WP8 的错误程序集。 + 正如我所说,这是一个不会改变的标准文本。我为什么要为这样的事情安装 htmlagilitypack?
  • 你的第一个模式匹配得很好,所以它一定是你的代码有错误。

标签: c# regex pattern-matching match


【解决方案1】:

如果你可以使用 XML,下面的代码可以很好地工作

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string input =
                "<Root>" +
                    "<td class=\"artist\">" +
                      "<div class=\"wrapper ellipsis\">" +
                        "<a class=\"evt-click\" href=\"/artist/7\" data-target=\"artist\" itemprop=\"byArtist\">Jamiroquai</a>" +
                      "</div>" +
                    "</td>" +
                    "<td class=\"album\">" +
                      "<div class=\"wrapper ellipsis\">" +
                        "<a class=\"evt-click\" href=\"/album/98952\" itemprop=\"inAlbum\" data-target=\"album\" >A Funk Odyssey</a>" +
                      "</div>" +
                    "</td>" +
                    "<td class=\"length\">" +
                      "<div class=\"wrapper\" data-target=\"length\"></div>" +
                    "</td>" +
                    "<td class=\"popularity\" title=\"By popularity:7.85 / 10\">" +
                      "<span class=\"note\" data-target=\"note\"></span>" +
                    "</td>" +
                    "<td class=\"added\">" +
                      "<div class=\"wrapper ellipsis timestamp\" data-target=\"added\">" +
                        "05:23" +
                      "</div>" +
                    "</td>" +
                "</Root>";

            XElement doc = XElement.Parse(input);
            var results = doc.Descendants("div").Where(x => x.Attribute("class").Value == "wrapper ellipsis timestamp").FirstOrDefault().Value;
         }
    }
}
​

【讨论】:

  • 您不能使用 xml 解析器来解析 html。例如,&lt;br&gt;&lt;hr&gt;&lt;input&gt; 是不需要结束标签的有效 html 标签。
  • 同:例如发布一个随机的 json 文本,然后说 “如果你可以使用 JSON,那么下面的代码可以很好地工作” 从问题中可以清楚地看出 OP 不能使用 xml 解析器,否则你不会修复 sampe html 只是为了能够解析。
猜你喜欢
  • 1970-01-01
  • 2017-03-19
  • 1970-01-01
  • 2012-08-20
  • 1970-01-01
  • 2016-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多