1

特定の文字が存在するかどうかをチェックして、文字列が有効/無効かどうかをテストしています。;を含む文字列 #/%= | + \ "<>は無効と見なされます。現在、Javaで次の実装を行っていますが、より洗練された正規表現ソリューションを使用したいと思います。

public boolean isStringValid(String name) {
    if (   name.contains(";")
        || name.contains("#")
        || name.contains("/")
        || name.contains("%")
        || name.contains("=")
        || name.contains("|")
        || name.contains("+")
        || name.contains("\\")
        || name.contains("\"")
        || name.contains("<")
        || name.contains(">")) {
        return false;
    }
    else {
        return true;
    }
}

私がやったことはそれを次のように変更します、

public boolean isNameValid(String name) {
    return !Pattern.matches(".*(;|#|/|%|=|\\||\\+|\\\\|\"|<|>)+.*", name);
}

しかし、正規表現の文字列を正しく取得できないようです。すべてのJavaエスケープ文字を追加する前の元の正規表現文字列は次のとおりです。

.*(;|#|/|%|=|\||\+|\\|"|<|>)+.*

私の場合、「d @ vik」のような名前が有効であると考えられているため、[Az]のような文字クラスを使用することはオプションではないようです。

4

2 に答える 2

1

文字クラスを無効にすることができます:

Pattern.matches("[^;#/%=|+\\\\\"<>]+", name);
于 2012-06-04T06:28:43.130 に答える
1

あなたはほとんど正しいです。find()の代わりにメソッドを使用してmatches()ください。そして、パターンを一度だけコンパイルします。これは最も費用のかかる操作です。そして、あなたはパターンを単純化することができます:この場合あなたはあなたが探しているサブパターンの間[ ]に書く必要はありません:|

private static Pattern validator = Pattern.compile("[;%#=\\+]"); // etc: write all characters you need.

isNameValid()次に、次のように書き直します。

public boolean isNameValid(String name) {
    return !validator.find();
}

ところで、バックスラッシュに注意を払ってください。パターンにバックスラッシュを含める場合は、4回記述する必要があります。正規表現のエスケープ用に2回、Javaのエスケープ用に2回です。

于 2012-06-04T06:31:52.903 に答える