2011-10-18 6 views
1

1つの空白(単語間のスペースのみ)で区切られた1-N単語を含む可能性のある文字列のバリデーターを作成しようとしています。私は正規表現では初心者ですので、私は少し混乱し、私の表現を引き起こす正しいように見える:Regexpression asp.net validatorいくつかの単語

^[[a-zA-Z]+\s{1}]{0,}[a-zA-Z]+$ 

は、私はここで間違って何をしているのですか? (それは2単語しか受け付けませんが、1 +単語を受け入れるようにしています) 助けを歓迎します。

+0

は、この古典的なASPですか?またはASP.Net? (ご質問とタグを改訂してください) –

+0

修正していただきありがとうございます。 – Antenka

答えて

2

新しいプログラミング言語や構文を始めた人はよくあることですが、かなり! ^$のアンカーが正しく使用されており、文字クラス[a-zA-Z]は文字(音は私にとっては正しい)と一致しますが、あなたの繰り返しはちょっとおかしかったです。あなたのグループはあなたの主な問題です。

^[[a-zA-Z]+\s{1}]{0,}[a-zA-Z]+$ 
^   ^^^^^^^^ 
a   bbbacccc 

効果的にグループの繰り返しがないため、2つの単語にのみ一致します。これはあなたが本当にグループを持たないからです - 文字クラスだけです。最も簡単な修正はカッコする(上記のリストにa年代でマーク)最初[とその対応するendブレースを変更することです:

^([a-zA-Z]+\s{1}){0,}[a-zA-Z]+$ 

この単一の変更は、それはあなたが期待するように動作させるでしょう!しかし、私がしたいと思ういくつかの勧告と考慮事項があります。

最初に、可読性とコードのメンテナンスのために、可能な限り繰り返し中括弧の代わりに1文字の繰り返し演算子を使用してください。 *はゼロ回以上繰り返され、+は1回以上繰り返され、?は0回または1回繰り返される(AKA オプション、)。あなたの反復中括弧は構文的に正しいものであり、あなたが意図するものですが、(bのもの)は冗長で、もう一つは上記アスタリスク*、彼らはまったく同じ意味を持っているように:

^([a-zA-Z]+\s)*[a-zA-z]+$ 

第二に、私は次の点を考慮して、(アプリケーションの要件に応じて)を考慮代わりに[a-zA-Z]文字クラスの\w速記文字クラスをお勧めします:

  • it ma
  • 数字と0-9とアンダースコアも一致します
  • 多言語入力のために非英語(ユニコード)文字と一致するように構成されることがよくあります。

これらのいずれかが不必要な場合や望ましくない場合は、適切なトラックを使用してください。

文字の組み合わせ\bは、文字境界のアサーションであり、あなたの場合は必要ありません。既に始まり、終わるところには文字と文字のみがあります。

正規表現の詳細については、Regular-Expressions.infoをお勧めします。この正規表現については、正規表現とさまざまな実装の内部的なやり方について豊富な情報があります。また、RegexBuddyというツールを使って式をテストしデバッグします。

+0

うわー!それはすごい説明以上です:)ありがとう!今これらの表現はちょっと分かりにくいようです。私の正規表現では、[a-zA-Z]を指定しました。たとえば、書籍のタイトルの正規表現のように。そして、はい、私はこのサイトを使って学習していましたが、テストツールとして私はhttp://www.regexplanet.comを使用しました。どうもありがとう! – Antenka

+0

多くの本のタイトルに数字があり、句読点がたくさんありますが、特に古い書籍の場合は、それを考慮してください: –

+1

オンラインテストの場合は、[The tester at RegexLib.com] http://regexlib.com/RETester.aspx) - .Net、Silverlight、およびJavaScript(ブラウザに基づく)テストをサポートしています。 –

関連する問題