golangにおけるテキスト処理のあれこれ

golangでテキスト処理をやってた時にあるあるネタにぶつかったので、覚書程度に。

文字列の長さを知る

テキスト処理をしてるとある文字列の長さを知りたくなる。が、単純にlen(str) とかやると文字列のバイト数が分かるだけで、文字としてのカウントにならない。golangは内部的にUTF-8を使ってるので、日本語だと文字数よりもだいぶ長い。 そんな時はunicode/utf8func RuneCountInString(s string) (n int) を使えばよい。

文字列の次の一文字を取得する

文字列の最初の一文字を取得する場合はfunc DecodeRuneInString(s string) (r rune, size int)を使う。最初の文字(rune)とそのバイト数(size)を返してくれるので、最初から一文字づつ読み込んで処理していくなんて時にも使える。

いっそのことループで回したい

文字列を一つづつ読んでもいいけど、どうせ全部ループして読み込むならfor pos, ch := range s {} でsを構成する文字を一つづつ読み込んでループ処理が出来る。ちなみに、この場合のposはバイト数で数えた時の先頭位置が返される。くれぐれも文字数と勘違いしないように。

その他もろもろ

上に書いたxxxInStringは名前の通り引数に文字列を受け取るけど、InString部分をのぞいた名称でバイト列を受け取るメソッドも用意されてるし、その他にもいくつかメソッドが準備されてるので、これ以外はこちらを参照のこと : https://godoc.org/unicode/utf8