我试图通过删除特殊字符来清理字符串。也就是说,我想保留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
)。但它不属于片假名脚本。只有真正的音节才属于片假名。
您可以做的一件事是将Katakana
的script
指示替换为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}]"