【问题标题】:Regex: Find pagenumber from partial matching urls正则表达式:从部分匹配的网址中查找页码
【发布时间】:2014-12-31 06:00:56
【问题描述】:

众所周知,Regex 模式会在您第一次看到它们时让您胃口大开(或者第 10 次,因为您从未真正了解过它。Quilty。)。我目前正在阅读它,但由于我的截止日期很紧,我会在这里查看是否可以同时获得更快更好的答案/解释。

我有一些论坛帖子的网址,我想浏览 html 并找到该帖子的最后一页。

所以说我有以下网址之一来识别有问题的线程:

并且我想获取在 html 文档中的上述任何“部分”匹配之后直接出现(下一个路径)的所有值(整数)。

因此,从以下任何 位于 html 文档中的任何位置的 hrefs(文档表示为单个字符串):

我想提取数字 34(只有 34),所以我可以将其解析为 int。

编辑

好吧,为了更简单:

假设我拥有htmlString 中的所有html,并且在这个字符串中我想找到出现在我的输入字符串/forum/thread-93912 之后的所有 个数字x

这些都出现在htmlString中,我要提取数字:

  • thread-93912/34
  • thread-93912/14
  • thread-93912/84
  • thread-93912/64
  • thread-93912/4

【问题讨论】:

    标签: c# regex


    【解决方案1】:

    您不需要正则表达式。只需使用System.Uri.Segments

    Uri url = new Uri("your url here");
    Console.WriteLine(url.Segments[4]);
    

    【讨论】:

    • 这可以工作,但是我必须遍历这些段并找到匹配 url 的“最后一段”之后的第一个数字。我并不总是事先知道页面值是什么部分。此外,我首先必须在 html 中获取所有匹配的 href,然后为每个片段循环。如果可以用简洁的正则表达式模式全部解决,那将是可取的。
    • @helmesjo 您不需要遍历该段。你可以只做url.Segments[(url.Segments.IndexOf(Thread-93912) + 1)],它总是在最后一个片段之后找到片段。
    • 虽然是隐式循环;)但是,是的,我明白了。至少,我不会对正则表达式模式摸不着头脑,我不知道它们是如何工作的......我会等到我尝试了一些解决方案,但如果没有一个按预期工作,我会将其标记为答案。
    • @helmesjo 针对这个问题的非正则表达式解决方案总是比使用正则表达式更好,只是说
    • 是的,我也有这种感觉,正在寻找有问题的问题。尤其是当我知道杰克关于正则表达式的时候。
    【解决方案2】:
    \b(\d+)\b(?=[^\d]*$)
    

    试试这个。见 demo.grab the capture。

    http://regex101.com/r/sU3fA2/55

    使用系统; 使用 System.Text.RegularExpressions;

    class Program
    {
        static void Main()
        {
        Regex regex = new Regex(@"\b\d+\b(?=[^\d]*$)");
        Match match = regex.Match("/forum/thread-93912/34");
        if (match.Success)
        {
            Console.WriteLine(match.Value);
        }
        }
    }
    

    【讨论】:

    • 劳驾,这一定是史上最快的答案。我试试看!
    • 抱歉。现在尝试了,但由于我什至不知道如何区分正则表达式,所以我不确定我在看什么。在您的演示页面中,我将在哪里输入页码之前的部分应该是线程 url 的部分匹配?或者我必须用 Regex.Match 试试吗?正如我所说,我知道 zip 关于这一点。 :)
    • 哦,我看到你在匹配检查中使用了错误的输入。我想在“someHtmlString”中查找与“/forum/thread-93912”的任何部分匹配,并在匹配后获取所有数字。如果我不是很清楚,请告诉我,很难解释!
    • 好吧,我明白我解释错了......我帖子中的后者href(somesite.com/forum/thread-93912/34等)实际上还没有找到。它们位于表示为单个字符串的 html 文档中的“某处”。 更新帖子
    • @helmesjo 你能贴出字符串吗?
    【解决方案3】:

    由于我的问题有点难以彻底解释(而且我稍微“改变”了我的问题),我想我会添加自己的答案以获得我使用的确切代码(我来了感谢这里的其他答案,所以我会给你们一个赞成票!)。

    我确信这可以变得更漂亮和更紧凑,但我是为了清楚,因为我是正则表达式的新手!

    首先,获取与 url 匹配的所有字符串 + 某个数字(用斜线“/”分隔),然后将该数字提取到一个名为“page”的组中。

    Regex regex = new Regex(urlToThread + @"/(?<page>\d+)");
    MatchCollection matches = regex.Matches(htmlString);
    

    然后迭代所有匹配并提取“页面”值(保证为整数),并将其解析为整数。将所有已解析的整数添加到列表中,并在完成后进行排序。最后一个将是最大的(最后一页)。

    List<int> pages = new List<int>();
    foreach(Match match in matches)
        pages.Add(int.Parse(match.Groups["page"].Value));
    pages.Sort();
    // And here we get the last page
    int nrOfPages = pages[pages.Count-1];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-13
      • 1970-01-01
      • 2021-03-14
      相关资源
      最近更新 更多