복붙노트

[RUBY-ON-RAILS] 왜 문자열 # GSUB 이중 컨텐츠를합니까?

RUBY-ON-RAILS

왜 문자열 # GSUB 이중 컨텐츠를합니까?

s = "#main= 'quotes'
s.gsub "'", "\\'" # => "#main= quotes'quotes"

이것은 잘못된 것 같다, 나는 "# 주 = \\ '따옴표를 \\'"을 기대할

내가 이스케이프 문자를 사용하지 않는 경우, 다음은 예상대로 작동합니다.

s.gsub "'", "*" # => "#main= *quotes*"

그래서 탈출 함께 할 수있는 뭔가가 있어야합니다.

루비 1.9.2p290 사용

나는 백 슬래시와 따옴표와 작은 따옴표를 교체해야합니다.

더욱 불일치 :

"\\'".length # => 2
"\\*".length # => 2

# As expected
"'".gsub("'", "\\*").length # => 2
"'a'".gsub("'", "\\*") # => "\\*a\\*" (length==5)

# WTF next:
"'".gsub("'", "\\'").length # => 0

# Doubling the content?
"'a'".gsub("'", "\\'") # => "a'a" (length==3)

무슨 일이야?

해결법

  1. ==============================

    1.당신은 정규 표현식 대체 문자열 내부의 \의 특별 함 '에 의해 넘어지고있어 :

    당신은 정규 표현식 대체 문자열 내부의 \의 특별 함 '에 의해 넘어지고있어 :

    그래서 당신은 '\\ 이중이 하나의 백 슬래시되고 결과가 \하지만 그 수단 "\\"'말할 때 "마지막으로 성공한 일치의 오른쪽에있는 문자열입니다." 당신이 탈출 따옴표와 작은 따옴표를 교체하려는 경우, 당신은 '\의 특별 함을 과거이게 더 탈출해야합니다

    s.gsub("'", "\\\\'")
    

    또는 이쑤시개를 방지하고 블록 양식을 사용 :

    s.gsub("'") { |m| '\\' + m }
    

    당신이 역 따옴표, 더하기 기호, 또는 한 자리를 탈출하려고한다면 당신은 유사한 문제로 실행됩니다.

    여기에 전체 교훈은 아무것도 GSUB의 블록 형태하지만 대체의 가장 사소한를 선호하는 것입니다.

  2. ==============================

    2.

    s = "#main = 'quotes'
    
    s.gsub "'", "\\\\'"
    

    이후 \ 그건 \\ 상응하는 당신이 사람의 네 가지를 넣어 가지고 이중 백 슬래시를 얻으려면.

  3. ==============================

    3.당신은뿐만 아니라 \를 탈출해야합니다

    당신은뿐만 아니라 \를 탈출해야합니다

    s.gsub "'", "\\\\'"
    

    출력

    "#main= \\'quotes\\'"
    

    좋은 설명은 외부 포럼에서 발견 :

    출처

  4. from https://stackoverflow.com/questions/7074337/why-does-stringgsub-double-content by cc-by-sa and MIT license