Regex.Replace只替换字符串的开头

时间:2010-04-13 22:03:35

标签: c# regex replace

我正在尝试用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标记呢?

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分: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这样的正则表达式工具?

答案 2 :(得分:1)

正则表达式采用最长匹配,在这种情况下是整个字符串,因为条件是它以[开头,以]结尾并且在它们之间至少有一个反斜杠。重新指定正则表达式,以便不允许括号内的其他],例如使用[^\]]代替.(两次出现)。