String.split() 方法删除德语变音符号
German umlauts are deleted by String.split() method
当我拆分一串单词时,变音符号被删除了。
public static void main(String[] args) {
String s = "überbrücken";
String[] ss = s.split("\W");
System.out.println(ss[0] + ss[1] + ss[2]);
}
returns“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
- A non-word character: [^\w]
\w
- A word character: [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+", "[=10=]\u2980")
// split the string into an array
// around these delimiters
.split("\u2980");
// output
System.out.println(Arrays.toString(arr));
// [ü, berbrü, cken]
另请参阅:
•
• How do I sort lexicographically with sorted(comparator) method?
当我拆分一串单词时,变音符号被删除了。
public static void main(String[] args) {
String s = "überbrücken";
String[] ss = s.split("\W");
System.out.println(ss[0] + ss[1] + ss[2]);
}
returns“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
- A non-word character:[^\w]
\w
- A word character:[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+", "[=10=]\u2980")
// split the string into an array
// around these delimiters
.split("\u2980");
// output
System.out.println(Arrays.toString(arr));
// [ü, berbrü, cken]
另请参阅:
•
• How do I sort lexicographically with sorted(comparator) method?