【问题标题】:Captures in C# regexesC# 正则表达式中的捕获
【发布时间】:2017-06-05 01:01:26
【问题描述】:

这段代码应该将img src的值转换为本地路径。

var matches = Regex.Replace(html, "(<[ ]*img[^s]+src=[\"'])([^\"']*)([\"'][^/]*/>)", 
  (match)=> {
    return string.Format("{0}{1}{2}", 
      match.Captures[0], 
      HostingEnvironment.MapPath("~/" + match.Captures[1]),
      match.Captures[2]);
});

它正确匹配整个图像标签,但只有一个捕获。我认为括号分隔捕获,但它似乎并没有那样工作。

我应该如何写这个来获得三个捕获,中间一个是路径?

【问题讨论】:

  • 你输入的字符串是什么?
  • 同样不要使用 Regex 来解析 HTML
  • @Andrey 作为一般规则,我衷心同意。在这种情况下,我使用 HTML 作为模板标记,我通过 html 到 pdf 转换器填充。转换器的一个缺点是它不能解析资源,除非你指定一个绝对的本地文件系统路径。自动解析通过转换器填充 HTML 的代码中的网络相对路径意味着我可以拥有一个模板,该模板呈现为可供浏览器使用的网页以进行预览和测试。

标签: c# regex-group


【解决方案1】:

尝试使用 Groups Property 而不是 Captures,如下所示:

var matches = Regex.Replace("<img src=\"dsa\"/>", "(<[ ]*img[^s]+src=[\"'])([^\"']*)([\"'][^/]*/>)", 
    (match)=> {
        return string.Format("{0}{1}{2}", 
            match.Groups[1], 
            HostingEnvironment.MapPath("~/" + match.Groups[2]),
            match.Groups[3]);
        });

【讨论】:

  • 是的,我自己刚刚发现了这个。那么什么是捕获,因为这是组?如果有四个图像标签,就会有四个捕获,这就是捕获吗?
  • This post 对此有一些很好的答案。
猜你喜欢
  • 1970-01-01
  • 2019-10-05
  • 1970-01-01
  • 1970-01-01
  • 2014-01-02
  • 2016-10-09
  • 2012-08-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多