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]

这意味着不包括重音字符。

有两种方法可以解决这个问题:

  1. 指定标志 UNICODE_CHARACTER_CLASS.

    这可以通过将该标志作为第二个参数添加到 Pattern.compile() 或通过在正则表达式本身中指定标志来完成:

    split("(?U)\W")
    
  2. 使用 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?