【问题标题】:RegEx: Match AND Capture in .NET with one pattern正则表达式:在 .NET 中使用一种模式匹配和捕获
【发布时间】:2013-10-29 14:24:28
【问题描述】:

在 .NET 中处理 RegEx 时,我有两个选择:

  1. 检查字符串是否匹配:

    <a ([^>]*?)href=\"http://the.site.com/photo/[0-9]*\">

  2. 捕捉图案的一部分:

    <a ([^>]*?)href=\"http://the.site.com/photo/(?<photoname>.*?)\">

但是如果我想检查模式匹配并捕获与单个 RegEx 匹配的部分怎么办?

【问题讨论】:

  • 如果不匹配,它将如何捕获它...? lookaheads/lookbehinds 用于捕获匹配的一部分
  • @Jonesy: (?<photoname>.*?) 将捕获任何字符序列,但我只需要[0-9]*
  • @Paul -- 你为什么将[0-9]* 替换为.*
  • @BeemerGuy.net:因为我不懂正则表达式,所以我在这里问。
  • @Paul -- 好吧,我以为你是故意的。您可以将[0-9]* 模式保留在捕获字符串中,例如(?<photoname>[0-9]*?),所以就像回答者告诉您的那样,您可以捕获并匹配相同的模式字符串......如果您只是匹配,则分组(括号部分)无关紧要。

标签: c# regex capture


【解决方案1】:

在捕获时使用它:

<a ([^>]*?)href=\"http://the.site.com/photo/(?<photoname>[0-9]+)\">

【讨论】:

  • 如果href = 之间有空格怎么办!如果href不是唯一的属性怎么办..如果它是一个自封闭的标签怎么办..请不要使用正则表达式..那会破坏你的代码..请
  • @Anirudh 你要找到的其他 999 个失败状态呢?
  • @Gusdor 999+ 是文字本身包含锚标记的情况。(例如,cmets 和 ans on SO,它们不是 html 本身的一部分,而是文字)你如何区分它们.Also可能有任意数量的空格,你不会为每个空格添加\s,或者你是
  • 虽然?[^&gt;]*?..regex 中是多余的,但应该是&lt;a ([^&gt;]*)href\s*=\s*\["']http://the.site.com/photo/(?&lt;photoname&gt;[0-9]+)\["'][^&gt;]*
【解决方案2】:

使用htmlAgilityPack

HtmlDocument doc = new HtmlDocument();
doc.Load(htmlUrl);

var pattern=@"^(?<=https?://the.site.com/photo/)\d+$";
var hrefList= doc.DocumentNode
                 .SelectNodes("//a[@href]")
                 .Select(p =>p.Attributes["href"].Value)//select all hrefs
                 .Where(p => Regex.IsMatch(p,pattern))//filter href
                 .Select(p=>Regex.Match(p,pattern).Value);//select required digits

【讨论】:

  • 敏捷包在这里是多余的。简单的 OP 想要匹配 URL。
  • @Gusdor 想出一个正则表达式..我会给出 1000 个案例来打破它......;)
【解决方案3】:

先生,您可以用一种模式匹配并捕获到一个命名组中!

<a (?:[^>]*?)href\s*?=\s*\"http://the.site.com/photo/(?<photoname>[0-9]+)\"

名为photoname 的组将包含您想要的捕获。

即使href 不是a 元素的第一个属性,这个正则表达式也可以工作。它也会忽略任意空格。

【讨论】:

    猜你喜欢
    • 2017-06-06
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多