我正在尝试通过删除特殊字符来清理字符串以制作slug。也就是说,我想保留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
它不在我列出的脚本中吗?
编辑:好的,如果您愿意,请在此处编写代码,但它不会提供比正则表达式本身更多的信息。它最有用,所以人们可以试试。
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);
}
}
答案 0 :(得分:2)
不,事实上,它不在列出的脚本中。 Unicode Standard将此字符放在this.componentWillReceiveProps = function(nextProps) {
if (nextProps.MetaItemId !== this.props.MetaItemId){
ItemStore.CallItem("TenantId", nextProps.MetaItemId);
}
}
脚本中。
应该区分Unicode中的“script”和“block”。该角色属于片假名块,以及其他一些不是字母的字符,例如“片假名迭代标记”(Common
)。但它不属于片假名脚本。只有实际的音节属于片假名剧本。
您可以做的一件事是将\u30fd
指示替换为script
的{{1}}:
block
在这种情况下的输出将包括延长的声音标记。
或者你可以这样做:
Katakana
此模式将匹配所有语言中的所有单词字符,包括但不限于日语。
对于输入字符串output = input.replaceAll("[^-_.\\w-\\p{script=Han}\\p{script=Hira}\\p{block=Katakana}\\p{script=Hang}]", "");
,这将产生
アレルギーabceⸯd漢字ру́сский
而我的第一个建议是带有块的那个,输出将是:
アレルギーabced漢字
所以如果你只想限制日语(和韩语),我的第一个建议可能更适合你,而如果你想要所有国际单词字符,第二个会更好。
答案 1 :(得分:0)
为了避免匹配该字符,您应该将其添加到否定的类中。
"[^-_ー.\\w-\\p{script=Han}\\p{script=Hira}\\p{script=Kana}\\p{script=Hang}]"