2017-01-31 6 views
-3

goを使用して[]の文字列を検索する方法はありますか?goを使用してオフセットインデックスを文字列で検索する方法

私はこの作業を文字列型で行うことができます。

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

しかし、私はルーン文字のために必要です。

私は綱を持ち、オフセットインデックスを取得したいと考えています。

どのようにルーン型でこの作業を行うことができますか?よりundrestandため

の例では、必要性を望む:可能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);} 

出力はありますか? 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上でそれを試してみてください):しかし、それは2つのforループでそれを実装するのは簡単です

7 

編集:検索することを示す質問を更新しましたの

あなたが簡単な型変換を使用してstring[]runeを変換することができる:あなたはあなたの例で行ったように

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

そして、そこから上の、あなたがstrings.Index()を使用することができますが:

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

てみてくださいそれはGo Playgroundにあります。

オリジナルの答えは次のとおりです。移動中


string値はUTF-8でエンコードされたバイトとして格納されています。 strings.Index()は、指定された部分文字列が見つかると、バイト位置を返します。

だから、基本的には、このバイト位置を縄の位置に変換するだけです。 unicode/utf8パッケージには、stringutf8.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()を使用してください。

関連する問題