2014-04-15 1 views
2
난 그냥 스크립트 언어에 대한 몇 가지 인터프리터를 만들려고 해요

, 나는 지금 만나 실제 문자로 (\로) 두 문자 긴 문자를 해석하는 방법 인 것 중 하나, 예를 들어@ " n"이라는 두 자로 된 문자열을 실제 char ' n'로 변환하는 방법은 무엇입니까?

: 일 당신은 단지 하나의 문자 내에서 입력 할 수 없습니다 : newline에 대한 '\n''\'''에 대한 등등 ..

내 통역이 얻을 수있는 정보는 문자열 다음 "\"가에 문자 후 주문 문자로 "n" 전에 읽기 때문에 "\\n" 편집기에서 사용자가 입력하는 텍스트에서 반복하십시오.

+2

당신이 공유 할 수있는 코드가 있습니까 :

예를 들어, (그것은 U를 \ 처리하지 않습니다, \ u 또는 \ X,하지만 확장 할 수 있습니다) 다음과 같은 골격을 고려? 나는 당신이 성취하려는 것을 확신하지 못합니다. –

+0

원래의 질문에서, 당신은''\\ n ''보다는 "\ n"을 해석하고 싶었지만, 백 슬래시를 읽을 때마다 개행 문자 코드로 바꿀 수는 없습니까? – Couchy311

+0

네, 죄송 합니다만, "\\ n"과 @ "\ n"사이에 약간 혼란스러워하고 제목에 문자열 앞에 @ 기호를 넣는 것을 잊어 버렸습니다. 편집자에게 많은 감사를드립니다. – Lispwave

답변

4

문자열에 "\\ n"이 있다고 이해 했으므로 처리하기 전에 "\\ n"을 "\ n"으로 바꾸는 것이 가장 쉬운 방법입니다.

string replaced = original.Replace("\\n", "\n"); 

이스케이프 처리 된 문자를 바꾸려면 Regex.Unescape을 사용할 수 있습니다.

unescape은 모든 것을 이스케이프 처리하지 않으므로 "\\."만 이스케이프 처리하고 싶다면주의하십시오. 시퀀스는 먼저 정규 표현식을 사용하여 ("\\\\ [a-zA-Z0-9]"와 같은) 일치시킨 다음 결과를 반복하고 이스케이프 처리되지 않은 버전으로 바꿉니다.

+1

@ D.Diamond [C# string literal] (http://msdn.microsoft.com/en-us/library/ms228362.aspx)는 소수의 '\ escapes'만 허용합니다. – user2864740

+0

이스케이프 처리 된 문자를 솔루션으로 업데이트 – Gusman

+0

'\\ n '대신'\\\ n'을 사용 하시겠습니까? 또는 심지어 \\\\ n 어느 것이 든 작동합니다. – SSpoke

-2

string literals의 구문 분석 중에 발생하는 \n과 같은 이스케이프 시퀀스를 문자열의 한 문자 '\n'으로 바꾸는 표준 방법이 없습니다. 그러나 간단한 대체 기능을 만드는 것은 그리 어렵지 않습니다.

string EscapeLikeALiteral (string src) { 
    return Regex.Replace(src, @"\\(?<simple>['""\\0abfnrtv])", (m) => { 
     var s = m.Groups["simple"].Value; 
     switch (s) { 
      case "'": return "'"; 
      case "\"": return "\""; 
      case "0": return "\0"; 
      case "a": return "\a"; 
      case "b": return "\b"; 
      case "f": return "\f"; 
      case "n": return "\n"; 
      case "r": return "\r"; 
      case "t": return "\t"; 
      case "v": return "\v"; 
      default: 
       throw new InvalidOperationException(); 
     } 
    }); 
} 

var r = EscapeLikeALiteral(@"hello\nworld"); 
+0

Regex.Unescape – Gusman

+0

@Gusman 아니요, Regex.Unescape는 동일하지 않습니다 - [Regex.Unescape] (http://msdn.microsoft.com/en-us/library/system.text.regularexpressions) .regex.unescape (v = vs.110) .aspx)는 Regex의 반대입니다.이스케이프 (escape)하지만 메소드 이름과 나머지 답변에 표시된 것처럼이 코드 나 연산과 동일하지 않습니다. 특히, Regex.Escape는 리터럴에서 유효하지 않은 일부 매핑을 역전합니다. – user2864740

+0

@ D.Diamond 설명서를 먼저 읽으십시오. 그런 규칙으로 살 수 있다면 OK. – user2864740

관련 문제