teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

NKFC機能版

2020/03/31 06:24

投稿

xebme
xebme

スコア1109

answer CHANGED
@@ -24,4 +24,35 @@
24
24
  }
25
25
 
26
26
  }
27
- ```
27
+ ```
28
+ ###
29
+ **NKFC機能版**
30
+
31
+ ```Java
32
+ static Function<String,String> partiallyConvert =
33
+ s -> (s.compareTo("A") >= 0 && s.compareTo("Z") <= 0 ||
34
+ s.compareTo("a") >= 0 && s.compareTo("z") <= 0 ||
35
+ s.compareTo("0") >= 0 && s.compareTo("9") <= 0 ||
36
+ s.compareTo("。") >= 0 && s.compareTo("゚") <= 0)
37
+ ? Normalizer.normalize(s, Normalizer.Form.NFKC) : s;
38
+
39
+ // NFKC機能を有効にするには、半角カタカナを1文字づつ処理してはならない。
40
+ // 濁点、半濁点をそれが修飾する文字とセットにする。
41
+ static BiConsumer<LinkedList<String>,String> withConsonantMark =
42
+ (a,s) -> {
43
+ if (!a.isEmpty() && ("゙".equals(s) || "゚".equals(s)))
44
+ a.add(a.removeLast() + s);
45
+ else
46
+ a.add(s);
47
+ };
48
+
49
+ static Function<String, String> convert =
50
+ s -> s.chars()
51
+ .mapToObj(c -> String.valueOf((char) c))
52
+ .collect(LinkedList<String>::new, withConsonantMark, List::addAll)
53
+ .stream()
54
+ .map(partiallyConvert)
55
+ .collect(Collectors.joining());
56
+ ```
57
+
58
+ `partiallyConvert`はjimbeさんの正規表現に近くなりました。