LoginSignup
8
5

More than 5 years have passed since last update.

Go言語で SplitMultiSep (複数種の区切り文字列で分解)

Last updated at Posted at 2015-06-10

Go言語の strings.Split は文字列を分解する際に区切り文字が1種類しか指定出来ません。
例えば、a,b;c という区切りがある場合に、, と ; のどちらかでしか区切れません。

試しに複数指定対応の関数を作ってみましたが、仕事では(ちょっとした特殊な条件が必要で)使えなかったので、こちらにコードを晒します。ご参考までに。

プログラム

splitmultisep.go
package main

import (
        "fmt"
        "strings"
)

func SplitMultiSep(s string, sep []string) []string {
        var ret []string
        ret = strings.Split(s, sep[0])
        if len(sep) > 1 {
                ret2 := []string{}
                for _, r := range ret {
                        ret2 = append(ret2, SplitMultiSep(r, sep[1:])...)
                }
                ret = ret2
    }
        return ret
}

func main() {
    var s string = "a&b,c;d"
        a := SplitMultiSep(s, []string{"&", ",", ";"})
    fmt.Println(a)
}

実行結果

$ go run splitmultisep.go
[a b c d]

仕組み

区切り文字列の配列を渡されるので、まず一つ目の区切り文字列で分解して、分解された文字列を各々2つ目の区切り文字列で分解して、というのを再帰的に繰り返します。

追記 (regexp 方式)

そもそも regexp で良いとの指摘を複数受けました。


package main

import "fmt"
import "regexp"

func main() {
    var s string = "a&b,c;d"
    a := regexp.MustCompile("[&,;]").Split(s, -1)
    fmt.Println(a)
}

速度を気にする場面でも正規表現をコンパイルしてキャッシュすれば良さそうですし、こっちの方が良いかも?

8
5
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
5