回答編集履歴

1

NKFC機能版

2020/03/31 06:24

投稿

xebme
xebme

スコア1090

test CHANGED
@@ -51,3 +51,65 @@
51
51
  }
52
52
 
53
53
  ```
54
+
55
+ ###
56
+
57
+ **NKFC機能版**
58
+
59
+
60
+
61
+ ```Java
62
+
63
+ static Function<String,String> partiallyConvert =
64
+
65
+ s -> (s.compareTo("A") >= 0 && s.compareTo("Z") <= 0 ||
66
+
67
+ s.compareTo("a") >= 0 && s.compareTo("z") <= 0 ||
68
+
69
+ s.compareTo("0") >= 0 && s.compareTo("9") <= 0 ||
70
+
71
+ s.compareTo("。") >= 0 && s.compareTo("゚") <= 0)
72
+
73
+ ? Normalizer.normalize(s, Normalizer.Form.NFKC) : s;
74
+
75
+
76
+
77
+ // NFKC機能を有効にするには、半角カタカナを1文字づつ処理してはならない。
78
+
79
+ // 濁点、半濁点をそれが修飾する文字とセットにする。
80
+
81
+ static BiConsumer<LinkedList<String>,String> withConsonantMark =
82
+
83
+ (a,s) -> {
84
+
85
+ if (!a.isEmpty() && ("゙".equals(s) || "゚".equals(s)))
86
+
87
+ a.add(a.removeLast() + s);
88
+
89
+ else
90
+
91
+ a.add(s);
92
+
93
+ };
94
+
95
+
96
+
97
+ static Function<String, String> convert =
98
+
99
+ s -> s.chars()
100
+
101
+ .mapToObj(c -> String.valueOf((char) c))
102
+
103
+ .collect(LinkedList<String>::new, withConsonantMark, List::addAll)
104
+
105
+ .stream()
106
+
107
+ .map(partiallyConvert)
108
+
109
+ .collect(Collectors.joining());
110
+
111
+ ```
112
+
113
+
114
+
115
+ `partiallyConvert`はjimbeさんの正規表現に近くなりました。