2

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

4

1 に答える 1

2

したがって、制約に適合する正規表現を探しているだけの場合は、次のようなものです

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

トリックを行う必要があります。入力に、ある文字クラスから別の文字クラスへの少なくとも 1 つの遷移があることを確認します。

否定的な先読みを使用すると、維持するのが少し簡単になります

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

3 つの項により、入力が 1 つの文字クラスの文字だけで構成されていないことが保証されます。

式をテストするコードを次に示します。

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)
}
于 2012-05-02T09:05:25.007 に答える