2010-04-13 6 views
1

친숙한 URL 패턴을 html 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

+0

@SLaks라는 한정어를 보내 주셔서 감사합니다. –

+0

끝내 주셔서 감사합니다! –

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_ matches를 대체합니다.) – SLaks

+0

대체로 정적 인 버전을 사용하지 않기 때문에 확실하지 않았습니다. –

+0

좋은 아이디어에 감사드립니다. 그러나 시나리오가 웹 입력이 아니기 때문에 필요하지 않습니다. –

1

정규 표현식, 당신의 상태에 따라이 [로 시작하는 것이 있기 때문에이 경우, 전체 문자열 인 일치를 취하는 ]로 끝 사이의 어딘가에 적어도 하나의 백 슬래시가 있습니다. 대괄호 안에 다른 ]이 허용되지 않도록 정규 표현식을 다시 지정하십시오 (예 : . (두 번 발생) 대신 [^\]]을 사용하십시오.

+0

이것은 정답입니다. – SLaks

관련 문제