Java 从假名脚本中排除Unicode日语延长音标?
我正试图通过删除特殊字符来生成slug来清除字符串。也就是说,我想保留CJK字符,否则这些语言将一无所获 因此,我有一个正则表达式,它应该通过列出脚本来保留CJK字符:Java 从假名脚本中排除Unicode日语延长音标?,java,regex,unicode,cjk,Java,Regex,Unicode,Cjk,我正试图通过删除特殊字符来生成slug来清除字符串。也就是说,我想保留CJK字符,否则这些语言将一无所获 因此,我有一个正则表达式,它应该通过列出脚本来保留CJK字符: "[^-_.\\w-\\p{script=Han}\\p{script=Hira}\\p{script=Kana}\\p{script=Hang}]" 问题是,片假名延长了音标“ー" 似乎被排除在外 下面是显示问题的代码: 它不在我列出的脚本中吗 编辑:好的,如果你愿意,在这里编码,但是它没有提供比正则表达式本身更多的信息
"[^-_.\\w-\\p{script=Han}\\p{script=Hira}\\p{script=Kana}\\p{script=Hang}]"
问题是,片假名延长了音标“ー" 似乎被排除在外
下面是显示问题的代码:
它不在我列出的脚本中吗
编辑:好的,如果你愿意,在这里编码,但是它没有提供比正则表达式本身更多的信息。它非常有用,所以人们可以尝试
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);
}
}
为了避免匹配该字符,应该将其添加到否定类中
"[^-_ー.\\w-\\p{script=Han}\\p{script=Hira}\\p{script=Kana}\\p{script=Hang}]"
不,事实上,它不在列出的脚本中。将此字符放置在
公用脚本中
在Unicode中应该区分“脚本”和“块”。该字符属于片假名块,以及其他一些非字母的字符,如“片假名迭代标记”(\u30fd
),但它不属于片假名脚本。片假名脚本中只有实际的音节
您可以做的一件事是将脚本
指示替换为块
,用于片假名
:
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漢字ру́сский
アレルギーabceⸯD漢字ру́сский
鉴于我的第一个建议,即带有块的建议,输出将是:
アレルギーabced漢字
アレルギー放弃漢字
因此,如果您只想限制为日语(和韩语),我的第一个建议可能更适合您,而如果您想要所有国际单词字符,第二个会更好。它在\p{Lm}类别,请参阅。将字符添加到否定字符类是否解决了问题?确切的问题是什么?Stribizev是的,解决了它。谢谢!请注意,有许多非日语字符与\p{Lm}
类别匹配。@erwan.作为答案发布。或\\p{InKatakana}
-谢谢你对我以前的回答所作的评论。谢谢,这实际上是最好的回答。我用日语回答这个问题,因为我懂日语,但我们有许多其他非拉丁语的用户,他们会很乐意保留这些单词。