2011-05-08 1 views
5

작은 따옴표로 묶인 문자열 리터럴 내 백 슬래시의 이스케이프 상태에 대해 String#tr이라는 신비한 점이 있습니다. 아래의 세 가지 예를 비교해 볼 수 있습니까? 나는 특히 두 번째 것을 이해하지 못한다. 복잡성을 피하기 위해 여기서는 'd'을 사용하고 있는데, 큰 따옴표 ("\d" = "d")로 이스케이프 할 때 의미를 변경하지 않습니다.문자열 리터럴 내에서 'String # tr'의 인수로 이스케이프 상태

'\\'.tr('\\', 'x')  #=> "x" 
'\\'.tr('\\d', 'x')  #=> "\\" 
'\\'.tr('\\\d', 'x') #=> "x" 
+0

흥미 롭습니다. 그리고 왜 '\\ rs'.tr ('\\ rs ','x ')'는'\\ xx'를 반환합니까?! 나는'xxx'의 반환 값을 기대했을 것입니다. 그리고 [documentation example] (http://ruby-doc.org/core/classes/String.html#M001199)에서 "hello".tr ('aeiou', '*')','*'는 더 짧습니다. 'aeiou'보다, 그래서 * to_str이 from_str보다 짧으면, 마지막 문자 * 을 의미하는 패딩이됩니까? 그게 버그 야? 비행 거리 야? 슈퍼맨인가요? : D – Zabba

+0

@Zabba 그것은 "hello".tr ('aeiou', '* #')'는 "hello"와 동일하다는 것을 의미합니다.tr ('aeiou', '* ####')'. : D – sawa

+0

'\\ d .tr ('\\ d', 'xx)'에서 어떤 출력을 기대할 수 있습니까 (아직 실행하지 마십시오.). 나는 그것이 * 제공하는 것을 기대하지 않는다 .. – Zabba

답변

9

많은 정규 표현식에 그룹화 괄호 문자처럼 tr

tr의 첫 번째 인수 작동에서 탈출. 표현식의 처음에 ^을 사용하여 일치하지 않는 항목을 대체하고 일치하지 않는 항목을 바꿀 수 있습니다. a-f을 사용하여 일련의 문자를 찾습니다. 제어 문자가 있기 때문에 내부적으로 이스케이프 처리되기 때문에 -^을 리터럴 문자로 사용할 수 있습니다. 작은 따옴표를 사용하는 경우 루비 따옴표 문자열

에서 탈출

print 'abcdef'.tr('b-e', 'x') # axxxxf 
print 'abcdef'.tr('b\-e', 'x') # axcdxf 

는 또한, 루비가 가능한 경우가 실제로 다른 백 슬래시 또는 단일 견적을 탈출하는 데 사용되지 않습니다 때, 즉를 백 슬래시를 포함하려고합니다.

# Single quotes 
print '\\' # \ 
print '\d' # \d 
print '\\d' # \d 
print '\\\d' # \\d 

# Double quotes 
print "\\" # \ 
print "\d" # d 
print "\\d" # \d 
print "\\\d" # \d 

예제는 마음에 모든 것을 함께

을 재 방문,의 다시 예를 살펴 보자. 첫 번째 백 슬래시 탈출 때문에

'\\'.tr('\\', 'x')  #=> "x" 

'\\' 정의 문자열 리터럴 스트링 \된다. 거기에 놀라움이 없습니다.

'\\'.tr('\\d', 'x')  #=> "\\" 

'\\d' 정의 문자열 리터럴 스트링 \d된다. tr 엔진은 리터럴 문자열의 백 슬래시를 사용하여 d을 이스케이프 처리합니다. 결과 : d의 인스턴스가 tr으로 바뀝니다.

'\\'.tr('\\\d', 'x') #=> "x" 

'\\\d' 정의 문자열 리터럴 \\d된다. 먼저 \\\이됩니다. 그러면 \d\d이됩니다. 즉, 백 슬래시가 보존됩니다. 백 슬래시 또는 대체 문자열과 d 중 모든 문자를 대체 \\d 다음 tr하게

리터럴 문자열 (이 특정 동작은 외로운 d를 떠나, 백 슬래시 살아 먹을 것 두 문자열과는 다릅니다) .

+1

설명해 주셔서 감사합니다. 좋은. – sawa