从Kana脚本中排除的Unicode日语延长声音标记?

时间:2015-06-09 15:01:58

标签: java regex unicode cjk

我正在尝试通过删除特殊字符来清理字符串以制作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);
    }
}

2 个答案:

答案 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}]"