Unicode日文延长的音标从假名脚本中排除



我试图通过删除特殊字符来清理字符串。也就是说,我想保留CJK字符,否则这些语言就没有什么可用的了。

所以我有一个正则表达式,应该保持CJK字符通过列出脚本:

"[^-_.\w-\p{script=Han}\p{script=Hira}\p{script=Kana}\p{script=Hang}]"

问题是片假名的延长音标记"似乎被排除了。

http://www.unicodemap.org/details/0x30FC/index.html

下面是显示问题的代码:

https://github.com/erwan/unicode-java-issue/blob/master/src/main/java/com/example/Hello.java

不在我列出的脚本中吗?

edit:好的,如果你喜欢,这里的代码,但它并没有提供比正则表达式本身更多的信息。它主要是有用的,所以人们可以尝试它。

package com.example;
class Hello {
    public static void main(String[] args) {
        String input = "%;アレルギー[]abcd";
        String output= input.replaceAll("[^-_.\w-\p{script=Han}\p{script=Hira}\p{script=Kana}\p{script=Hang}]", "");
        System.out.println(output);
    }
}

不,事实上,它不在列出的脚本中。Unicode标准将此字符放在Common脚本中。

应该区分Unicode中的"script"one_answers"block"。该字符属于片假名,以及其他一些不是字母的字符,如"片假名迭代标记"(u30fd)。但它不属于片假名脚本。只有真正的音节才属于片假名。

您可以做的一件事是将Katakanascript指示替换为block:

output = input.replaceAll("[^-_.\w-\p{script=Han}\p{script=Hira}\p{block=Katakana}\p{script=Hang}]", "");

在这种情况下,输出将包括延长的声音标记。

或者你可以这样做:

Matcher m = Pattern.compile("[^-_.\w]",Pattern.UNICODE_CHARACTER_CLASS).matcher(input);
output = m.replaceAll("");

此模式将匹配所有语言中的所有单词字符,包括但不限于日语。

对于输入字符串"%;アレルギー[]{}=abceⸯd漢字ру́сский",这将产生
 abceⸯd сский

而我的第一个建议,有块的那个,输出将是:

所以,如果你只想限制日语(和韩语),我的第一个建议可能更适合你,而如果你想要所有国际单词字符,第二个建议会更好。

为了避免匹配该字符,您应该将其添加到被否定的类中。

"[^-_ー.\w-\p{script=Han}\p{script=Hira}\p{script=Kana}\p{script=Hang}]"

最新更新