2010-04-13 88 views
1

我想用html的URL表示法替换一个友好的url模式,但由于缺乏正则表达式的经验,我无法弄清楚为什么我的正则表达式只替换了我的模式的第一次出现:Regex.Replace只替换字符串的开始

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标记呢?

回答

4

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

+1

这是正确的答案。 (你需要同时改变'。+') – SLaks 2010-04-13 22:10:52

+0

感谢您的资格,@SLaks。 – 2010-04-13 22:17:01

+0

真棒谢谢! – 2010-04-13 22:32:48

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这样的正则表达工具?

+0

这不是问题所在。 ('Regex.Replace'代替_all_匹配) – SLaks 2010-04-13 22:10:20

+0

不确定,因为我通常不使用静态版本的替换,我会更新。 – 2010-04-13 22:19:09

+0

感谢您的建议,好主意。但在我的情况下不需要,因为它不是网络输入。 – 2010-04-13 22:33:40

1

正则表达式取最长比赛,在这种情况下是整个字符串,因为你的条件是,它与[开始,用]结束,并且在两者之间至少有一个反斜杠的地方。重新指定正则表达式,以便不允许括号内的其他],例如使用[^\]]而不是.(两次出现)。

+0

这也是正确的答案。 – SLaks 2010-04-13 22:14:49