2013-04-12 2 views
0

문자열의 맞춤 태그를 가져 와서 대체하는 우아한 방법은 무엇입니까? 예를 들어문자열에서 맞춤 태그를 가져 오는 우아한 방법

"some long text [o:prop] and [u:date]" 

결과 어레이 :

  • "[0 : 소품]"
  • "[U : 일]"

감사

+0

태그 및 그 대체 태그 목록이 있습니까? –

+0

예, 내 자신의 태그와 내 함수는 자신의 대체물을 반환합니다 – Mennion

답변

2
@"\[[a-z]:[a-z]{4}\]" 

모든 대괄호로 둘러싸인 네 개의 소문자 다음에, 다음에 콜론 1 소문자를 가정 해보십시오.

+0

흥미 롭습니다. 그러면 더 안전하게 보입니다. "\\ [(. *?)]"감사합니다. – Mennion

1

항상 위험 해.하지만 너는 갈 수있어. 글로벌 수정

"\\[(.*?)]" 

: 같은 몇 가지 정규식.

안전한 : \\[(o:prop|u:date)]

+0

답변 주셔서 감사합니다, 예, 정규식은 내 첫 번째 아이디어지만, 정규식은 조금 안전하지 않습니다. – Mennion

+0

그런 식으로 사용하면됩니다. 태그 목록을 지정하면 그 정도는 아닙니다. – Loamhoof

+0

왜 안전하지 않은지주의해야합니까? –

0

var replacements = new Dictionary<string,string> { 
    {"[o:prop]","FISH"}, 
     {"[u:date]","2013-04-12"} 
}; 

var testString = "some long text [o:prop] and [u:date]"; 

var result= new Regex(@"\[[^[]*?]").Replace(
     testString, 
     match => replacements.ContainsKey(match.Value) ? replacements[match.Value] : match.Value); 
+0

점 스타를 사용하지 마십시오! (대괄호가 중첩되어 있으면 작동하지 않습니다.)'\ [. *? \]'가 문자열에 적용될 때 일치하는 것을 알 수 있습니다 :''some long [text [o : prop] and [a [u : date] ] "'? 당신이 생각하는 것이 아닙니다! 훨씬 빠르고 정확한 표현은'\ [[^ [\]] * \]'입니다. 당신이 말하는 것을 말하십시오 - 당신이 말하는 것을 의미합니다. – ridgerunner

+0

@ridgerunner better? 비 욕심 많은 표현을 사용하는 경우 제외 할 필요가 없음 –

+0

예, \ [[^ [] *?]'는'\ [. *? \]'보다 훨씬 낫습니다. (이제는 가장 안쪽의 일치하는 대괄호 쌍 정확하게). 그러나 탐욕스러운'\ [[^]] * \]'표현식은 브라켓 내용을 한 단계로 완성하기 때문에 훨씬 빠릅니다. 게으른 버전은 각 문자를 한 번에 하나씩 일치시키기 전에 멈추고 앞으로 (예 : 역 추적)해야합니다. – ridgerunner

관련 문제