2012-05-02 5 views
2

私は今、grailsプロジェクトに取り組んでいます。私は望んでいたデータをフィルタリングするのに苦労しています。すべての文字と数字(大文字と小文字)、およびキーボード上のすべての特殊文字(@ * $ &#)を受け入れることができるフィールドがあります。数字と文字の組み合わせ(0925abc)または文字、数字、特殊文字の組み合わせ(0925abc?> <)の場合にのみ、入力を受け入れます。純粋な文字(adCbT)、純粋な数字(0383)または純粋な特殊文字(@#$> _ + - )の場合、システムは入力を拒否します。これはgrailsの正規表現の制約で可能ですか?あなたの知識を共有してくれてありがとう。regex constraints validation-grails

+0

このw.r.t.ですドメインクラスのフィールド?バリデーターを使ってみましたか? http://grails.org/doc/latest/ref/Constraints/validator.html –

+0

はい、そうですが、バリデーターを使用するとラインで無駄になると思います。正規表現検証を使う方がはるかに簡単だと思います。使用方法を混乱させるだけです。 – antibry

+0

すべてのインスタンスで操作を行う場合は、操作自体は非常に効率的です。また、regexは他の場所と同じように動作します。とにかく、コード例がありますか?サンプルコードを見ずに問題を解決するのは難しいです。 –

答えて

2

あなたは自分のcontraintsに合った正規表現を探しているのであれば、

'.*([a-zA-Z][[email protected]*$&#]+|[0-9][[email protected]*$&#]|[@*$&#][0-9a-zA-Z]).*' 

のようなものは、トリックを行う必要があります。入力時に、ある文字クラスから別の文字クラスへの遷移が少なくとも1つ存在することを確認します。否定先読みで

は、3つの用語が入力1つの文字クラスからのみcharectersから構成されていないことを確認してください

'^(?![a-zA-Z]+$)(?![0-9]+$)(?![@*$&#]+$).+$' 

を維持するためにも、少し簡単です。ここ

は、式をテストするためにいくつかのコードです:

def ok = ['asdasd90','90asdas','asd#sdfsd9','asd9sdf','908787#@'] 
def nok = ['asdewSDFDSFasd','23803','@*$&#'] 
def expression = '^(?![a-zA-Z]+$)(?![0-9]+$)(?![@*$&#]+$).+$' 
ok.each { value -> 
    assert value.matches(expression) 
} 
nok.each { value -> 
    assert !value.matches(expression) 
}