【问题标题】:Replace substring inside a string with a new GUID for each substring found将字符串中的子字符串替换为找到的每个子字符串的新 GUID
【发布时间】:2014-07-18 02:53:53
【问题描述】:

我有一个带有多个<p> 标签的正文。我想为这段文本中每次出现的 P 标签插入一个 GUID。

最初我是这样做的text = text.Replace("<p>", "<p data-paragraph-id=" + Guid.NewGuid().ToString() + ">");

但是,正如您所见,这将为每个 P 标签放置相同的 GUID。我的问题是:如何为每次出现的 P 标签插入唯一的 GUID?

【问题讨论】:

  • 对不起!感谢您编辑它!

标签: c# regex asp.net-mvc


【解决方案1】:

您正在寻找允许为每个匹配返回自定义结果的Regex.Replace(或其静态版本):

字符串替换(字符串输入,MatchEvaluator 求值器)

在指定的输入字符串中,将匹配指定正则表达式的所有字符串替换为 MatchEvaluator 委托返回的字符串

示例:

var result = Regex.Replace(text, "<p>", _ => 
       "<p data-paragraph-id=" + Guid.NewGuid().ToString() + ">");

旁注:如果您尝试修改 HTML,请考虑使用 HTMLAgilityPack 阅读并通过 DOM 添加属性...比您可以想出的任何 RegEx/字符串替换/连接更安全/更具可扩展性。

【讨论】:

  • 有趣。我不知道 HTMLAgilityPack。它看起来像是我绝对可以使用的东西!
  • 以前从未听说过Regex.Replace,有趣
  • 也许有一个小建议,那就是在结果中包含引号:"&lt;p data-paragraph-id=\""+ Guid.NewGuid().ToString() + "\"&gt;"
  • -1 用于建议正则表达式。为什么不直接回答 HtmlAgilityPack 呢?这样做,我将删除反对票。
  • @JohnSaunders - 我对 -1 很好 :) - 问题是关于替换和 happen 以使用 HTML 作为示例。所以每当有人试图找到这个问题时,它不太可能被 HTML 而不是常规的字符串处理......(而且我懒得放好的 HtmlAgilityPack 示例......也许有一天)。
【解决方案2】:

这是一个 LINQ 方法来做你想做的事:

var parts =
    text
        .Split(new string[] { "<p>" }, StringSplitOptions.None)
        .SelectMany(x => new []
        {
            x,
            "<p data-paragraph-id=\"" + Guid.NewGuid().ToString() + "\">"
        })
        .ToArray();

var result = String.Join("", parts.Take(parts.Length - 1));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-06
    • 2017-04-24
    • 2012-04-03
    • 2013-07-23
    • 2016-09-10
    相关资源
    最近更新 更多