问题描述
当我拆分一串单词时,元音会被删除。
public static void main(String[] args) {
String s = "überbrücken";
String[] ss = s.split("\\W");
System.out.println(ss[0] + ss[1] + ss[2]);
}
返回“berbrcken”而不是“überbrücken”
解决方法
在 \P{IsAlphabetic}
处拆分(大写 P
)
String s = "überbrücken röntgenstraheln ängstlich";
String[] textArr = s.split("\\P{IsAlphabetic}");
System.out.println(Arrays.toString(textArr));
输出:
[überbrücken,röntgenstraheln,ängstlich]
像 \W
这样的基本正则表达式类只识别 ASCII 字符,因此只有 A 到 Z 和 a 到 z 算作字母,这解释了您观察到的结果。不过,通过某些 \P{…}
构造也支持 Unicode 字符。请参阅 Andreas 知识渊博的回答和 the documentation 了解更多信息。
免责声明:我想让我的代码保持简单,并猜测它可能是您真正想要的。我没有试图模仿您自己的代码所做的仅针对带有元音变音的元音所做的调整。如果这不是你想要的,我相信你会从这里调整我的代码。
,文档,即 Pattern
的 javadoc,明确指出:
\W
- 一个非单词字符:[^\w]
\w
- 一个单词字符:[a-zA-Z_0-9]
这意味着不包括重音字符。
有两种方法可以解决这个问题:
-
指定标志
UNICODE_CHARACTER_CLASS
。这可以通过将该标志添加为
Pattern.compile()
的第二个参数,或通过在正则表达式本身中指定该标志来实现:split("(?U)\\W")
-
使用 Unicode 类别:
split("[^\\p{L}_\\p{N}]")
作为替代解决方案,您可以向 非单词 字符添加一些分隔符,并围绕这些 分隔符 拆分字符串,保留 非单词 个字符:
String str = "überbrücken";
String[] arr = str
// add some delimiters to a non-empty
// sequences of non-word characters
.replaceAll("\\W+","$0\u2980")
// split the string into an array
// around these delimiters
.split("\u2980");
// output
System.out.println(Arrays.toString(arr));
// [ü,berbrü,cken]
另见:
• How to remove sequence of two elements from array or list?
• How do I sort lexicographically with sorted(comparator) method?