2009-11-13 2 views
0

모든 중괄호를 찾아 다른 문자열로 바꾸려면 하나의 정규 표현식을 사용하고 싶습니다.정규식으로 모든 커플 링 브래킷을 찾는 방법은 무엇입니까?

예를 들어, 나는 "{foo는}" "BAR"와 "FOO"와 "{줄}"와 "{}"EMPTY "로 대체 할 ". 입력이 "abc {foo} def {bar} {}"이면 출력은 "abc FOO def BAR EMPTY"입니다.

중첩 대괄호 또는 결합 대괄호는 사용할 수 없습니다. 문자 "{"또는 "}"이 필요한 경우 그것은 두 배가되어야합니다. 그래서, "{{def}}"는 단지 "{def}"입니다.

{} 내의 다른 문자열은 허용되지 않습니다. 라고 말하면 단지 "{foo}"및 "{bar}"이 필요합니다. 따라서 "abc {xyz} def"은 잘못된 입력으로 인식되어야합니다.

+0

sed를 사용하고 있습니까? 펄? 자바? 파이썬? 다른 것? – Beta

+0

C#,하지만별로 중요하지 않다고 생각합니다. –

+1

거의 모든 정규식 구현은 약간의 차이점이 있습니다. 예를 들어 JavaScript를 사용한다면'Dav'의 첫 번째 제안을 사용할 수 없습니다. Perl을 사용했다면 대문자 사용은 한 번에 끝날 수 있습니다. 그래서 예, 중요합니다 * 중요합니다. –

답변

3

당신이 부정적인 lookbehinds 가능/lookaheads있는 경우 :

(?<!{){([a-z]+)}(?!}) 

과 일치하는 그룹의 값으로 대체합니다. ([a-z]+)이 포함 된 문자열과 일치

(?<!{){ 전에 두 번째 {가없는 확인합니다, 그리고 (?!})} 후 두 번째 }가없는 확인합니다.

당신이 다음

(?^|[^{]){([a-z]+)}(?$|[^}) 
0

lookbehinds/lookaheads, 내가 먼저 가서 정규 표현식을 사용하지 않고 EMPTY{}을 대체 할이없는 경우.

그런 다음

(?<!{){(foo|bar)}(?!}) 

{foo} 또는 {bar}하지만 {} 또는 {{anything}} 또는 {anything}

역 참조 없음에 맞게 사용합니다. 1은 일치하는 텍스트를 포함합니다.

를,

Regex matches = new Regex(@"(?<!\{)\{(foo|bar)\}(?!\})", RegexOptions.IgnoreCase); 
resultString = matches.Replace(subjectString, "$1".ToUpper()); 

(나는 C 번호를 모르는 내가 틀렸다면 그래서 저를 수정하시기 바랍니다, 나는 문자열의 ToUpper() 호출하면 작동 희망)처럼

은 그래서 코드는 볼 수 있었다
+0

나는 C#에 익숙하지 않지만 '$ 1''문자열 리터럴이 처음으로 대문자가되고 (아무 것도 변경되지 않음) 거의 확실하다. 그리고 그 연산 후에 정규 표현식 대체 문자열로 사용된다. –

관련 문제