【问题标题】:Regex.Replace only replaces start of stringRegex.Replace 仅替换字符串的开头
【发布时间】:2011-02-07 16:17:21
【问题描述】:

我正在尝试用 html url 表示法替换友好的 url 模式,但由于缺乏正则表达式经验,我无法弄清楚为什么我的正则表达式只替换了我的模式的第一次出现:

string text = "[Hotel Des Terrasses \http://flash-hotel.fr/] and [Du Phare \http://www.activehotels.com/hotel/]";
text = Regex.Replace(text, @"\[(.+)\s*\\(.+)\]", "<a href=\"$2\" target=\"_blank\">$1</a>");

我怎样才能将第二个模式也替换为 HTML 标记?

【问题讨论】:

    标签: c# regex replace


    【解决方案1】:

    您的正则表达式将整个字符串视为单个匹配项。尝试使用(.+?) 而不是(.+)(两个实例)。

    【讨论】:

    • 这是正确答案。 (您需要同时更改.+'s)
    • 感谢预选赛@SLaks。
    【解决方案2】:

    作为旁注,您可能需要考虑可能滥用此功能。您可能应该执行:

            StringBuilder sb = new StringBuilder();
            int pos = 0;
    
            Regex exp = new Regex(@"\[(.+?)\s*\\(.+?)\]");
            foreach (Match m in exp.Matches(text))
            {
                sb.Append(text, pos, m.Index - pos);
                pos = m.Index + m.Length;
    
                Uri tmp;
                if(Uri .TryCreate(m.Groups[2], UriKind.Absolute, out tmp))
                {
                    sb.AppendFormat("<a href=\"{0}\" target=\"_blank\">{1}</a>",
                        System.Web.HttpUtility.HtmlAttributeEncode(tmp.AbsoluteUri),
                        System.Web.HttpUtility.HtmlEncode(m.Groups[1])
                        );
                }
            }
            sb.Append(text, pos, text.Length - pos);
    

    注意:不确定组索引,我会在 reg-ex 中使用命名组。你试过像Expresso这样的正则表达式工具吗?

    【讨论】:

    • 这不是问题。 (Regex.Replace 替换 所有 个匹配项)
    • 不确定,因为我通常不使用替换的静态版本,我会更新。
    • 感谢您的建议,好主意。但在我的场景中不需要,因为它不是网络输入。
    【解决方案3】:

    正则表达式采用 longest 匹配,在这种情况下是整个字符串,因为您的条件是它以 [ 开头,以 ] 结尾并且至少一个反斜杠介于两者之间。重新指定正则表达式,以免括号内出现另一个],例如使用[^\]] 而不是.(两种情况)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-05
      • 2021-07-09
      • 1970-01-01
      • 2018-05-13
      • 1970-01-01
      • 1970-01-01
      • 2015-01-28
      • 1970-01-01
      相关资源
      最近更新 更多