【问题标题】:How to mimic transliterate in Java?如何在 Java 中模仿音译?
【发布时间】:2014-07-31 13:21:02
【问题描述】:

在 Perl 中,我通常使用音译来计算字符串中匹配一组可能字符的字符数。比如:

$c1=($a =~ y[\x{0410}-\x{042F}\x{0430}-\x{044F}]
            [\x{0410}-\x{042F}\x{0430}-\x{044F}]);

将计算 $a 中的西里尔字符数。与前面的示例一样,我有两个类(或两个范围,如果您愿意的话),我还有一些其他类:

$c4=($a =~ y[\x{AC00}-\x{D7AF}\x{1100}-\x{11FF}\x{3130}-\x{318F}\x{A960}-\x{A97F}\x{D7B0}-\x{D7FF}]
            [\x{AC00}-\x{D7AF}\x{1100}-\x{11FF}\x{3130}-\x{318F}\x{A960}-\x{A97F}\x{D7B0}-\x{D7FF}]);

现在,我需要在 Java 中做类似的事情。 Java中是否有类似的构造?或者我需要遍历所有字符,并检查它是否在每个类的限制之间?

谢谢

【问题讨论】:

    标签: java unicode tr


    【解决方案1】:

    在 Java 中没有见过像 tr/// 这样的东西。

    您可以使用类似的方法来计算所有匹配项:

    Pattern p = Pattern.compile("[\\x{0410}-\\x{042F}\\x{0430}-\\x{044F}]", 
                                Pattern.CANON_EQ);
    Matcher m = p.matcher(string);
    int count = 0;
    while (m.find())
        count++;
    

    【讨论】:

    • 这将(可能)比检查每个字符的 if 链慢。但有助于在 Java 和 Perl 中维护并行代码。谢谢。
    【解决方案2】:

    为了良好的顺序:使用 Java Unicode 支持。

    int countCyrillic(String s) {
        int n = 0;
        for (int i = 0; i < s.length(); ) {
            int codePoint = s.codePointAt(i);
            i += Character.charCount(codePoint);
            if (UnicodeScript.of(codePoint) == UnicodeScript.CYRILLIC) {
                ++n;
            }
        }
        return n;
    }
    

    这使用完整的 Unicode(其中两个 16 位字符可能代表一个 Unicode“代码点”。 而在 Java 中,Character.UnicodeScript 类已经拥有你需要的一切。

    或者:

    int n = s.replaceAll("\\P{CYRILLIC}", "").length();
    

    这里\\P\\p{CYRILLIC}西里尔字母组的否定。

    【讨论】:

      【解决方案3】:

      你可以试试这样玩:

      s.replaceAll( "[^\x{0410}-\x{042F}\x{0430}-\x{044F}]*([\x{0410}-\x{042F}\x{0430}-\x{044F}])?", "$1" ).length()
      

      这个想法是从这里借来的:Simple way to count character occurrences in a string

      【讨论】:

      • 是的,这是有道理的。可能更慢,因为它构造了一个新字符串。但只是测试。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-10
      • 2014-03-09
      • 2021-06-19
      • 1970-01-01
      • 1970-01-01
      • 2011-07-05
      相关资源
      最近更新 更多