簡體   English   中英

c#正則表達式問題

[英]c# Regex problems

我有我正在研究的正則表達式

string addressstart = Regex.Escape("<a href=\"/url?q=");
                string addressend = Regex.Escape("&amp");
                string regAdd = addressstart + @"(.*?)" + addressend;

我希望它給我這個 html 的 url

<a href="/url?q=https://www.google.com/&amp;sa=U&amp;ved=0ahUKEwizwPy0yNHSAhXMDpAKHec7DAsQFgh6MA0&amp;usg=AFQjCNEjJILXPMMCNAlz5MN1IIzjpr79tw">

所以它應該返回“ https://www.google.com/

任何想法為什么它不起作用? 謝謝!

以下正則表達式對我有用。 確保選擇組 1 ,因為組 0始終是完整字符串。

@"<a href=\"\/url\?q=(.*?)&amp"

看起來您正在尋找 google 的 url 作為字符串的一部分。 您可能會發現以下匹配它的模式很有用:

https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}

需要注意的是,這是對通用正則表達式的一個小調整: What is a good regular expression to match a URL?

編輯請參閱下面的代碼以應用此正則表達式並找到您要查找的值:

string input = "<a href=\"/url?q=https://www.google.com/&amp;sa=U&amp;ved=0ahUKEwizwPy0yNHSAhXMDpAKHec7DAsQFgh6MA0&amp;usg=AFQjCNEjJILXPMMCNAlz5MN1IIzjpr79tw\">";
var regex = new Regex(@"https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}");
var output = regex.Match(input).Value; // https://www.google.com

問題出在正則表達式的"<a href=\\"/url?q="部分。 ?沒有轉義。這意味着一個可選的l 。因此正則表達式的那部分匹配<a href="/urlq=<a href="/urq= 。都不包括?字符。

解析 HTML 時,應該考慮使用一些 HTML 解析器,例如 HtmlAgilityPack,並且只有在獲取必要的節點后,才能在文本上應用正則表達式。

如果你想調試自己的代碼,這里有一個修復:

using System;
using System.Text.RegularExpressions;

public class Test
{
    public static void Main()
    {
        var s = "<a href=\"/url?q=https://www.google.com/&amp;sa=U&amp;ved=0ahUKEwizwPy0yNHSAhXMDpAKHec7DAsQFgh6MA0&amp;usg=AFQjCNEjJILXPMMCNAlz5MN1IIzjpr79tw\">";
        var pattern = @"<a href=""/url\?q=(.*?)&amp;";
        var result = Regex.Match(s, pattern);
        if (result.Success)
            Console.WriteLine(result.Groups[1].Value);
    }
}

請參閱DotNetFiddle 演示

下面是一個示例,如何使用HtmlAgilityPack提取所有以/url?q=開頭的<a> href屬性值。 通過解決方案>管理解決方案的NuGet 包安裝它...並使用

public List<string> HapGetHrefs(string html)
{
    var hrefs = new List<string>();
    HtmlAgilityPack.HtmlDocument hap;
    Uri uriResult;
    if (Uri.TryCreate(html, UriKind.Absolute, out uriResult) && uriResult.Scheme == Uri.UriSchemeHttp)
    { // html is a URL 
        var doc = new HtmlAgilityPack.HtmlWeb();
        hap = doc.Load(uriResult.AbsoluteUri);
    }
    else
    { // html is a string
        hap = new HtmlAgilityPack.HtmlDocument();
        hap.LoadHtml(html);
    }
    var nodes = hap.DocumentNode.SelectNodes("//a[starts-with(@href, '/url?q=')]");
    if (nodes != null)
    {
       foreach (var node in nodes)
       {
           foreach (var attribute in node.Attributes)
               if (attribute.Name == "href")
               {
                   hrefs.Add(attribute.Value);
               }
        }
    }
    return hrefs;
 }

然后,您所需要的只是應用一個更簡單的正則表達式或幾個更簡單的字符串操作。

您可以使用:

(?<=a href="\/url\?q=)[^&]+

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM