Line data Source code
1 : // Package jpstring は、日本語文字列を正規化するユーティリティ関数群を提供します。
2 : // 半角/全角の揺れや空白・記号の統一など、バリデーション前の前処理を目的とします。
3 : package jpstring
4 :
5 : import (
6 : "strings"
7 : "unicode"
8 : )
9 :
10 : var (
11 : fullToHalfNum = map[rune]rune{
12 : '0': '0', '1': '1', '2': '2', '3': '3', '4': '4', '5': '5', '6': '6', '7': '7', '8': '8', '9': '9',
13 : }
14 : hyphenVariants = []rune{'ー', '-', '―', '‐', '−'}
15 : )
16 :
17 : // NormalizeSpaces は、全角スペースを半角スペースに変換し、
18 : // 連続する空白を 1 つにまとめて返します。
19 0 : func NormalizeSpaces(s string) string {
20 0 : return strings.TrimFunc(s, func(r rune) bool {
21 0 : return unicode.IsSpace(r) || r == ' '
22 0 : })
23 : }
24 :
25 : // NormalizeDigitsHyphen は、全角数字と全角ハイフンを半角に統一します。
26 0 : func NormalizeDigitsHyphen(s string) string {
27 0 : out := make([]rune, 0, len(s))
28 0 : for _, r := range s {
29 0 : if h, ok := fullToHalfNum[r]; ok {
30 0 : out = append(out, h)
31 0 : continue
32 : }
33 0 : replaced := false
34 0 : for _, hv := range hyphenVariants {
35 0 : if r == hv {
36 0 : out = append(out, '-')
37 0 : replaced = true
38 0 : break
39 : }
40 : }
41 0 : if replaced {
42 0 : continue
43 : }
44 0 : out = append(out, r)
45 : }
46 0 : return string(out)
47 : }
48 :
49 : // NormalizeJP は、日本語文字列全体を正規化します。
50 : // 全角/半角、スペース、数字・ハイフンの統一などを行います。
51 0 : func NormalizeJP(s string) string {
52 0 : return NormalizeDigitsHyphen(NormalizeSpaces(s))
53 0 : }
|