2017-01-31 2 views
-3

go를 사용하여 [] 룬에서 문자열을 찾을 수있는 방법은 무엇입니까?go를 사용하여 룬에서 문자열을 찾을 수있는 오프셋 색인

이 작업은 문자열 유형으로 수행 할 수 있습니다.

if i := strings.Index(input[offset:], "}}"); i > 0 {print(i);}

는하지만 난 룬을 위해 필요합니다.

나는 룬이 있고 오프셋 색인을 가져오고 싶습니다.

룬 문자 유형으로이 작업을 수행하는 방법은 무엇입니까? 9

하지만 (텍스트 변수)

수도] 룬 유형 이렇게 할 :이 예

int offset=0//mean start from 0 (this is important for me) 
string text="123456783}}56" 
if i := strings.Index(text[offset:], "}}"); i > 0 {print(i);} 

출력된다 : 더 undrestand위한

예해야 할? https://play.golang.org/p/seImKzVpdh

탱크 당신 :

내 현재 코드를 참조하십시오.

답변

2

편집 # 2 : 다시 질문의 "의미"새로운 유형의 표시 : 당신이 []runestring를 검색 할 수 있습니다.

답변 : 표준 라이브러리에서는 직접 지원되지 않습니다.

func search(text []rune, what string) int { 
    whatRunes := []rune(what) 

    for i := range text { 
     found := true 
     for j := range whatRunes { 
      if text[i+j] != whatRunes[j] { 
       found = false 
       break 
      } 
     } 
     if found { 
      return i 
     } 
    } 
    return -1 
} 

시험이 :

value := []rune("123}456}}789") 
result := search(value, "}}") 
fmt.Println(result) 

출력합니다 (Go Playground에 그것을 시도) :

7 

편집 그러나 2 개 for 루프와 그것을 구현하기 쉽습니다 : 검색하려는 질문을 업데이트했습니다. 에있는

쉽게 변환 할 수있는 []rune 간단한 형식 변환 사용 string A와 :

if i := strings.Index(text[offset:], toSearch); i > 0 { 
    print(i) 
} 

보십시오 : 당신이 당신의 예에서와 마찬가지로

toSearchRunes := []rune{'}', '}'} 
toSearch := string(toSearchRunes) 

그리고 거기에에서, 당신은 strings.Index()을 사용할 수 있습니다 Go Playground에 있습니다.

원래 대답은 다음과 이동에


string 값이 UTF-8로 인코딩 된 바이트로 저장됩니다. strings.Index()은 주어진 하위 문자열이 발견되면 바이트 위치를 반환합니다.

기본적으로 원하는 것은이 바이트 위치를 룬 위치로 변환하는 것입니다. unicode/utf8 패키지에는 string의 룬 - 계수 또는 룬 길이를 알려주는 유틸리티 함수가 포함되어 있습니다. utf8.RuneCountInString().

그래서 기본적으로 당신은 단지이 함수에 문자열을 전달해야

offset := 0 
text := "123456789}}56" 
if i := strings.Index(text[offset:], "}}"); i > 0 { 
    fmt.Println("byte-pos:", i, "rune-pos:", utf8.RuneCountInString(text[offset:i])) 
} 

text = "世界}}世界" 
if i := strings.Index(text[offset:], "}}"); i > 0 { 
    fmt.Println("byte-pos:", i, "rune-pos:", utf8.RuneCountInString(text[offset:i])) 
} 

출력합니다 (Go Playground에 그것을 시도) :

byte-pos: 9 rune-pos: 9 
byte-pos: 6 rune-pos: 2 

참고 : offset 또한 바이트 위치해야합니다, string을 자르는 경우 text[offset:]과 같이 인덱스가 바이트 인덱스로 해석되기 때문입니다.

rune의 색인을 얻으려면 strings.Index() 대신 strings.IndexRune()을 사용하십시오.