web-dev-qa-db-ja.com

文字列で大文字が連続して検出されるかどうかを確認するための正規表現

次の場合の正規表現を知りたい:

文字列にはアルファベットのみを含める必要があります。大文字で始まり、その後に小文字が必要です。その後、小文字または大文字にすることができます。

^[A-Z][a-z][A-Za-z]*$

ただし、文字列に連続する大文字を含めることはできません。そのロジックを正規表現に追加するにはどうすればよいですか?

つまり、HttpHandlerは正しいが、HTTPHandlerは間違っています。

61
kiki

編集:2015-10-26:賛成票に感謝します-しかし、 tchristの答え を見てください。特に、ウェブやより「国際的」なものを開発する場合は。

Oren Trutnersの答えは正しくありません(一致する必要があるが一致しない「RightHerE」のサンプル入力を参照)

正しい解決策は次のとおりです。

(?!^.*[A-Z]{2,}.*$)^[A-Za-z]*$

編集:

(?!^.*[A-Z]{2,}.*$)  // don't match the whole expression if there are two or more consecutive uppercase letters
^[A-Za-z]*$          // match uppercase and lowercase letters

/編集

ソリューションの鍵はネガティブな先読みです: http://www.regular-expressions.info/lookaround.html

37

[A-Z]または[a-z]を書き込むたびに、7ビットのASCIIデータのみを処理することにコミットします。それが本当に大丈夫なら、それで結構です。しかし、そうでない場合、これを支援するUnicodeプロパティが存在します。

Unicodeには2つではなく3つのケースがあります。さらに、大文字以外の文字もあります。一般に、文字は\pLプロパティで指定され、これらはそれぞれ、次の5つのサブカテゴリのいずれかに属します。

  1. 大文字\p{Lu}で指定;例:AÇDZÞΣSSὩΙST
  2. タイトルケース文字\p{Lt}で指定;例:LjDzSsᾨSt(実際にはSsStは大文字で、次に小文字ですが、areßのタイトルケースをそれぞれ要求した場合に得られるもの)
  3. 小文字\p{Ll}で指定;例:aαçdzςσþßᾡſt
  4. 修飾子​​文字\p{Lm}で指定;例:ʰʲᴴᴭʺˈˠᵠꜞ
  5. その他の文字\p{Lo}で指定;例:ƻאᎯᚦ京

あなたはcanこれらのいずれかを補完することができますが、\P{Lu}のような何かがを行うので、注意してくださいnotは大文字ではない文字を意味します。これは、大文字ではない任意の文字を意味します。

大文字またはタイトルケースのいずれかの文字には、[\p{Lu}\p{Lt}]を使用します。したがって、パターンに使用できます:

      ^([\p{Lu}\p{Lt}]\p{Ll}+)+$

最初の文字に続く文字を大文字だけに限定するつもりがない場合は、次のようにできます。

     ^([\p{Lu}\p{Lt}][\p{Ll}\p{Lm}\p{Lo}]+)+$

いわゆる「キャメルケース」識別子と一致させようとする場合、実際のルールはプログラミング言語に依存しますが、通常はアンダースコア文字と10進数(\p{Nd})を含み、リテラルのドル記号を含む場合があります。その場合、これらのいくつかを上記の2つの文字クラスのいずれかに追加することをお勧めします。たとえば、両方にアンダースコアを追加し、2番目にのみ数字を追加すると、次のようになります。

     ^([_\p{Lu}\p{Lt}][_\p{Nd}\p{Ll}\p{Lm}\p{Lo}]+)+$

ただし、さまざまなRFCおよびISO標準の特定の単語を扱っている場合、これらはASCIIのみを含むように指定されることがよくあります。その場合は、リテラル[A-Z] ideaで対応できます。実際に存在しない場合、その制限を課すことは親切ではありません。

141
tchrist
^([A-Z][a-z]+)+$

これは、大文字の後に1つ以上の小文字が続くシーケンスを探します。連続した大文字は、一度に1つしか許可されないため一致しません。その後に小文字を続ける必要があります。

12
Oren Trutner

Unicodeに関するtchristsの優れた投稿は別として、ネガティブな先読みを伴う複雑なソリューションは必要ないと思います...あなたの定義には、大文字の文字とそれに続く少なくとも1つのグループが必要です(小文字とオプションで大文字の文字が続きます) )

^
[A-Z]    // Start with an uppercase Letter
(        // A Group of:
  [a-z]  // mandatory lowercase letter
  [A-Z]? // an optional Uppercase Letter at the end
         // or in between lowercase letters
)+       // This group at least one time
$

もう少しコンパクトで読みやすいと思います...

5
Falco