2013-06-07 4 views
2

나는 토큰을 제거해야하는 일련의 문자열이 있습니다. 문자열은 데이터베이스에서 와서 각각의 토큰이 연관된 이벤트 객체의 속성 이름이비정상적으로 동작하는 Regex.Replace

Subject: Ticket ##TicketID## Created 
ShortText: Ticket ##TicketName## created (ID: ##TicketID##). 
LongText: <a href="##BaseUrl##/Ticket/Details/##TicketID##">##TicketName##</a> was created on ##CreatedOn##. 

같은 것을 보면, 어떤 행동을 기반으로 발사했다. 내가 지금까지 동적으로 값 객체 매핑 속성 이름을 기준으로 사전을 생성/그림 물건을 찾을 수 있었다

public class TicketCreatedEvent : ILAMPEvent { 
    public Guid TicketID { get; set; } 
    public string TicketName { get; set; } 
    public DateTime CreatedOn { get; set; } 
    public string BaseUrl { get; set; } 
} 

같은 예를 들어, TicketCreatedEvent 개체를 볼 수 있습니다. 나는 또한 Regex.Replace 호출에 대해 약간의 진전을 이룰 수 있었다. 제목 문자열의 토큰을 교체하여 사용하여 좋은 작품 : 그러나

Regex.Replace(templates.Subject, @"##(.*)##", match => map[match.Groups[1].Value]); 

, 그것은 ShortText 또는 LONGTEXT에 이렇게 좋은 작동하지 않습니다. 던져지고있는 예외에서 내가 말할 수있는 것부터 Regex는 너무 많이 매치됩니다. 대신 문자열에서

##TicketName## 

일치, 분명 내가 개별적으로 그 토큰에 각각 일치시킬

##TicketName## created (ID: ##TicketID## 

일치하려고. 나는 이것이 내 부분에 오류라고 생각하지만, 나는 무엇을 놓치고 있습니까?

답변

9

.*은 개입 할 수있는만큼 욕심이 많으며 일치 함은 ##입니다. @"##(.*?)##" :

  1. 게으른 한정사를 사용

    당신은 세 가지 옵션이 있습니다. 동일하게 작동하지만 지금은 .*?이 가능한 한 적은 수의 문자와 일치합니다. 이것은 대부분의 경우에 좋을 것입니다.

  2. # 중간에 ## s : @"##([^#]*)##"이 허용되지 않도록 구체적으로 지정하십시오. 그러나 ##hello#there##은 일치하지 않습니다.
  3. ####s : @"##((?:(?!##).)*)##" 사이에서 허용하지 않는 것이 더 구체적입니다. 이는 ##hello#there##을 허용합니다. 이것은 현재 응용 프로그램의 경우 잔인한 문제 일 수 있지만 중첩 된 구조를 다루는 경우와 같이 더 복잡한 상황에서 도움이됩니다.

의도가 가장 명확한 것을 사용하십시오.

+0

감사합니다. Tim. 나는 내가 이것을 놓친다는 것을 믿을 수 없다. .. 조금 조금 당혹 스러웠다. – Woods8460

관련 문제