2010-12-22 23 views
8

大文字と小文字を区別できる正規表現を作成しようとしていますが、スペース ' - '、 '、' '。'、 '('、 ' 。これまで私がこれまで行ってきたことですが何らかの理由で数字を入力させています。Regexは文字と一部の文字のみを許可します

^[a-zA-Z -,.()]*$ 

助けがあれば助かります!ありがとう。

+2

正規表現のトークンであるエスケープ文字:。() –

+1

@ Mathias E:文字グループ内では、すべての正規表現トークンをエスケープする必要はありません。 – unholysampler

+0

これは本当にあなたが実際に使用している正規表現ですか? – Gumbo

答えて

3

-,は、a-zのように範囲として解釈され、スペースからカンマまでのすべての文字を許可するという問題があります。エスケープし、少なくともいくつかのバグを修正する必要があります。

^[a-zA-Z \-,.()]*$ 

は、厳密に言えば、それらは正規表現で特別な意味を持っているので、あなたはおそらくも、あまりにも、.()をエスケープする必要があります。とにかく、[]の文脈の中でJavascriptの正規表現エンジン(私がテストしていたところ)が文字どおりに解釈されているように見えますが、明示的な方がずっと良いです。あなたの実際のコードがことだけでなく、おそらくこの正規表現を使用して問題を持っているので、

^[a-zA-Z \-,\.\(\)]*$ 

しかし、これはまだ、0-9数字を許可するべきではありません。

+0

文字クラスの中で '.'、'( '、') 'をエスケープする必要はありません。文字クラスでは、 ']'と '\'と '-'と'^'(どちらも位置に依存します)だけが特別な意味を持ちます。 – Gumbo

+0

@ Gumbo:ああ、すべての正規表現エンジンは十分にスマートですか?知っておいてよ:) – Matchu

+0

まあ、そうだと思います。 – Gumbo

12

-は、文字クラスでは特殊です。これは、a-zで行ったように範囲を定義するために使用されます。

^[a-zA-Z \-,.()]*$ 
     ^^ escaping \ 

または

^[-a-zA-Z ,.()]*$ 
^placing it at the beginning. 

または

^[a-zA-Z -,.()-]*$ 
      ^placing it at the end. 
を:あなたはそれをエスケープするか、範囲演算子として機能しないだろうということは、このような配置するいずれかの必要なリテラル -に一致するように

および興味深いことに

で、 Aが既に範囲に関与している -(私たちは文字通り扱いたい1)、 -を囲む文字の両方が文字通り再び扱われているので、最終的な場合 -
^[a-z-A-Z -,.()]*$ 
    ^placing in the middle of two ranges. 

a-zA-Z間の場所です。

上記のすべての方法のうち、エスケープ方法をお勧めします。これはコードを読みやすく理解しやすくするためです。 \を見る人は、エスケープが意図されていると思います。 -を先頭に置くと、後に文字クラスの前に文字を追加して-をエスケープせずに範囲を作成すると問題が発生します。

+0

:/正規表現を読んでいる人は、私は遠くに逃げることを好む。他の3つの答えを見てみると、これは意図的ではない行動の意図的な使用よりも誤植だと思う可能性が高くなります。 – Matchu

+0

@マッチゥ:あなたに同意してください。私は自分の投稿を更新しました。 – codaddict

+0

+1そのような良いと詳細な答えです。 – suryakiran

2

 -,[a-zA-Z -,.()]は、 (0x20)から,(0x2C)までの範囲を記載している。それは[ !"#$%'()*+,]に相当します。 -からエスケープするか、範囲インジケータとして解釈されない場所に配置する必要があります。

数字は0x30から0x39までですが、これはこの問題の原因ではありません。

0

私はjavascriptで試してみましたが、うまくいきます。しかし、他は正しいです。 javascriptの場合は、すべて正常に動作するかどうかをチェックしてください。そうしないと、チェックはまったく行われません。

関連する問題