例如:要将第一分组大写:
str = '1abc2aabbcc3aaabbbccc4'
pp str.sub(/(a{2})(b{2})/, '\1.upcase\2') # =>"1abc2aa.upcasebbcc3aaabbbccc4" 第一分组怎么没有变大写呢?
pp str.sub(/(a{2})(b{2})/, '\1'.upcase + '\2') # =>"1abc2aabbcc3aaabbbccc4" 奇怪,upcase()还是没起作用!?
pp str.sub(/(a{2})(b{2})/, $1.upcase + '\2') # =>"1abc2AAbbcc3aaabbbccc4" 使用$1而不是'\1',upcase()才起作用?
여기에는 두 가지 문제가 관련됩니다:
1,
'1'
및, 두 역참조의 차이점
2, 작은따옴표
'
와 큰따옴표"
의 미묘한 차이 루비내가
'1'
대신에1
를 쓴 것을 알 수 있습니다. 왜냐하면 Ruby에는1
같은 객체가 없기 때문입니다. 즉,1
만 쓸 수는 없습니다.질문 1:
을 일치시킬 때 그룹에 대한 역참조로 사용됩니다.'1'
은 일치 내에서 사용되고은 일치 외부에서 사용됩니다.
는 기본적으로 전역 변수입니다. 일반 일치가 발생하는 한
Ruby
은 이러한 전역 변수를 업데이트합니다.Perl
일반 디자인'1'
은 기본적으로 문자열이지만그러나 넓은 의미에서
으아악1
는 실제로sed
,echo str | sed -E 's,(a{2})(b{2}),21,g'
에서 사용되는 것과 같은 일반적인 일반 역참조입니다.설명:
'1'
은 일치하는 첫 번째 그룹, 즉a
을 나타내며 이는a
두 개가 반복됨을 의미합니다.그러나 특별한 점은 교체를 수행할 때
'1'
을 사용할 수도 있다는 것입니다.질문 2:
대부분의 경우
'
과"
은 동일하게 사용되지만처리에 차이가 있습니다. 큰따옴표
"1"
는"u0001"
즉,unicode
를 입력하는 데 사용됩니다. 문자는 하나의 문자입니다. 작은따옴표 안의'1'
은과
1
두 문자입니다. 위에서 언급했듯이'1'.upcase
실행 시에는 두 문자에 대해 실행됩니다. . 대문자이지만Ruby
에서는 소문자가 아닌 문자에 대한#upcase
메서드가 자체적으로 반환됩니다.여기에서 의미하는 바를 고려하면 먼저
답변:'1'
를aa
으로 바꾸고#upcase
메서드를 실행한 다음 원래 문자열을 교체해야 합니다. 내가 아는 한 Ruby가 아니면 이 작업을 수행할 수 없습니다. 레이어가 새로운 구문을 제공합니다. 그렇지 않으면'1'
은 일치하는 그룹에 대한 참조가 변수에 저장된 프로세스가 아닐 것으로 추측됩니다. 🎜 in'..'
>인용 문자열로 대체1
,
'1.upcase2'
,'1'
는 각각'1'
,aa
으로 바뀌고,bb
은 변경되지 않습니다..upcase
'1'.upcase
은'1'
과 연결됩니다.'2'
, 대문자
.upcase
'aa'
"1"을 입력해 보세요
매개변수가 메소드에 전달되면 매개변수가 먼저 계산된 다음 결과가 메소드에 전달됩니다.