3

文字列 (ほとんどの文字列は 1 つの CJK 文字のみ) が単語文字のみであるかどうかを確認する関数があり、何度も呼び出されるため、コストは受け入れられませんが、方法がわかりません。それを最適化します、何か提案はありますか?

/*\w is equivalent to the character class [\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}].
 For more details see Unicode TR-18, and bear in mind that the set of characters
 in each class can vary between Unicode releases.*/
private static final Pattern sOnlyWordChars = Pattern.compile("\\w+");

private boolean isOnlyWordChars(String s) {
    return sOnlyWordChars.matcher(s).matches();
}

s が「3g」、「go_url」、または「hao123」の場合、isOnlyWordChars(s) は true を返す必要があります。

4

4 に答える 4

4
private boolean isOnlyWordChars(String s) {
    char[] chars = s.toCharArray();    
    for (char c : chars) {
        if(!Character.isLetter(c)) {
            return false;
        }
    }    
    return true;
}

より良い実装

public static boolean isAlpha(String str) {
    if (str == null) {
        return false;
    }
    int sz = str.length();
    for (int i = 0; i < sz; i++) {
        if (Character.isLetter(str.charAt(i)) == false) {
            return false;
        }
    }
    return true;
}

または、Apache Commons を使用している場合は、StringUtils.isAlpha() . isAlphaの場合、答えの2番目の実装は実際にはソースコードからのものです。

アップデート

こんにちは返信が遅くなり申し訳ありません。ループが正規表現よりも速いことをいくつかの場所で読みましたが、速度についてはよくわかりませんでした。確実にするために、ideooneで次のコードを実行しました。結果は次のとおりです。

5000000回の繰り返し

あなたのコードで: 4.99秒(その後の実行時エラーのため、ビッグデータでは機能しません)

私の最初のコードで 2.71秒

私の2番目のコードで 2.52秒

500000回の繰り返し

あなたのコードで: 1.07 秒

私の最初のコードで 0.36秒

私の2番目のコードで 0.33秒

これが私が使用したサンプルコードです。

NB小さな間違いがあるかもしれません。それを使って、さまざまなシナリオでテストできます。Jan のコメントによると、それらは private または public を使用するなどのマイナーなことだと思います。はい、状態チェックは良い点です。

于 2013-06-21T03:10:17.723 に答える
1

私が見る唯一のことは、あなたのパターンを次のように変更することです:

^\\w++$

しかし、私はJavaの専門家ではありません

説明:

パターンのパフォーマンスを向上させるアンカー (つまり^ $) を追加しました (正規表現エンジンは、単語以外の最初の文字で最後に到達するまで失敗します)。所有量指定子 (つまり++) を追加したので、正規表現エンジンはバックトラック位置に関係なく、より高速になりました。

詳細はこちら

于 2013-06-21T03:09:40.673 に答える
1

主な問題はあなたのパターンだと思います。

テスト文字列の1つで失敗したことに気付いたとき、私は反復的な解決策に取り組んでいましたSupercalifragilisticexpalidociou5。この理由 \w+は、1 つ以上の単語文字があるかどうかだけを気にすることです。 既に一致した単語の文字以外を見ていなくてもかまいません。

これを修正するには、ルックアラウンドを使用します。

(?!\W+)(\w+)

\W+1 つ以上の文字が単語以外の文字 (&*()!@!#$ など) であることが判明した場合、条件は正規表現をロックします。

于 2013-06-21T03:29:37.517 に答える