JavaでTransherateを模倣する方法は?
質問
Perlでは、通常、翻訳者数を使用して、一連の文字のセットに一致する文字列内の文字数を数えます。のようなもの:
$c1=($a =~ y[\x{0410}-\x{042F}\x{0430}-\x{044F}]
[\x{0410}-\x{042F}\x{0430}-\x{044F}]);
.
は$ aでキリル文字の数を数えます。前の例と同様に、私は2つのクラス(またはあなたが好むならば2つの範囲)を持っています、私はいくつかのより多くのクラスで他の何人かを持っています:
$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の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++;
. 他のヒント
順番のため: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を使用します(2つの16ビット文字はUnicodeの "コードポイントを表すことがあります"です。 そしてJavaでは、Class Character.UnicodeScriptはすでに必要なものがすべてです。
または:
int n = s.replaceAll("\\P{CYRILLIC}", "").length();
.
ここ\\P
は、キリル系群の\\p{CYRILLIC}
の負である。
このようなもので遊ぶことができます:
s.replaceAll( "[^\x{0410}-\x{042F}\x{0430}-\x{044F}]*([\x{0410}-\x{042F}\x{0430}-\x{044F}])?", "$1" ).length()
.
ここから借りられた:カウントする簡単な方法文字列の発生
所属していません StackOverflow