1

関数を書き込もうとしています

func Anonymize(name string) string

名前を匿名化します。入力と出力のペアの例をいくつか示します。これにより、何をすべきかがわかります。

Müller → M.
von der Linden → v. d. L.
Meyer-Schulze → M.-S.

この関数は、任意の文字で構成された名前で動作するはずです。この機能を実装しているときに、次の質問がありました。

[]runeまたはが与えられた場合string、文字に対応するすべての修飾子と結合アクセントも取得されるという意味で、完全な文字を取得するために取得する必要があるルーンの数をどのように計算しますか。たとえば、入力が[]rune{0x0041, 0x0308, 0x0066, 0x0067}(文字列 ÄBC に対応します。ここで、Ä は A と結合ダイアレシスの組み合わせとして表されます) 場合、関数は 2 を返す必要があります。これは、最初の 2 つのルーン文字が最初の文字 Ä を生成するためです。最初のルーンだけを取った場合、間違っている A が得られます。

匿名化したい名前がアクセント付きの文字で始まる可能性があり、アクセントを削除したくないため、この質問に対する回答が必要です。

4

1 に答える 1

2

次の関数を試すことができます (「 Go 言語の文字列の長さ」に触発されました):

func FirstGraphemeLen(str string) int {
    re := regexp.MustCompile("\\PM\\pM*|.")
    return len([]rune(re.FindAllString(str, -1)[0]))
}

この例を参照してください:

r := []rune{0x0041, 0x0308, 0x0066, 0x0041, 0x0308, 0x0067}
s := string(r)
fmt.Println(s, len(r), FirstGraphemeLen(s))

出力:

ÄfÄg 6 2

その文字列は 6 つのルーン文字を使用する可能性がありますが、最初の書記素は 2 を使用します。


OP FUZxxlは別のアプローチを使用しました。unicode.IsMark(r)

IsMarkルーンがマーク文字(カテゴリ M) であるかどうかを報告します。

ソース (FUZxxl のplay.golang.orgから) には以下が含まれます。

// take one character including all modifiers from the last name
r, _, err := ln.ReadRune()
if err != nil {
    /* ... */
}

aln = append(aln, r)

for {
    r, _, err = ln.ReadRune()
    if err != nil {
        goto done
    }

    if !unicode.IsMark(r) {
        break
    }

    aln = append(aln, r)
}

aln = append(aln, '.')
/* ... */
于 2014-12-23T22:50:17.227 に答える