在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中是否有类似的结构?或者我需要迭代所有字符,并检查它是否在每个类的限制之间?
谢谢
答案 0 :(得分: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++;
答案 1 :(得分:1)
你可以试着玩这样的东西:
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
答案 2 :(得分:1)
为了良好的顺序:使用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&#34;代码点。&#34; 在Java中,Character.UnicodeScript类已经拥有了你需要的一切。
或者:
int n = s.replaceAll("\\P{CYRILLIC}", "").length();
此处\\P
是西里尔集团\\p{CYRILLIC}
的否定。