2013-09-28 2 views
1

Go에서 regexp를 사용하여 케이스를 교체하고 싶습니다. Javascript에서 비슷한 방법을 사용하려고했지만 Go를 $ 기호를 이해하는 방법을 알아낼 수 없습니다.Go : regexp to swap cases

func swapcase(str string) string { 
    var validID = regexp.MustCompile(`[A-Z]`) 
    return validID.ReplaceAllString(str, strings.ToLower(str)) 

/* 
var validID = regexp.MustCompile(`[a-z]`) 
return validID.ReplaceAllString(str, strings.ToUpper(str)) 
*/ 
} 

이것은 내 시도였습니다. 그것은 위와 아래로의 모든 변환을 위해 작동하지만, 내가하고 싶은 것은 동시에 모든 문자를 교환하는 것입니다. 예 : "Hello"---> "hELLO"

그리고 다음은 완벽하게 작동하는 Javascript의 코드입니다.

function SwapCase(str) { 

    return str.replace(/([a-z])|([A-Z])/g, 
     function($0, $1, $2) { 
      return ($1) ? $0.toUpperCase() : $0.toLowerCase(); 
     }) 
} 
+2

이 때문에 (https://code.google.com/p/go/issues/detail?id=5690) –

답변

1

당신은 (내가 생각하는)이 정규 표현식으로이 작업을 수행 할 수 있지만, strings.Map로 간단합니다.

package main 

import (
    "fmt" 
    "strings" 
) 

func swapCase(r rune) rune { 
    switch { 
    case 'a' <= r && r <= 'z': 
     return r - 'a' + 'A' 
    case 'A' <= r && r <= 'Z': 
     return r - 'A' + 'a' 
    default: 
     return r 
    } 
} 

func main() { 
    s := "helLo WoRlD" 
    fmt.Println(strings.Map(swapCase, s)) 
} 
+0

감사를 x10000 [submatches하는 기능을 대체 할 수있는 방법] 일 수있다. 나는 결코 매핑을 생각하지 않았다. 굉장해. 감사 –