74

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

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

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

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

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

4

5 に答える 5

170

[A-Z]書き込みまたはを行うときはいつでも[a-z]、1960年代の7ビットASCIIデータのみを処理することを明示的に約束します。それが本当に大丈夫なら、それなら大丈夫です。ただし、問題がない場合は、最新の文字データの処理に役立つUnicode文字プロパティが存在します。

Unicodeには2つではなく、3つのケースがあります。さらに、大文字と小文字を区別しない文字もあります。一般に文字は\pLプロパティによって指定され、これらのそれぞれも5つのサブカテゴリの1つに正確に属します。

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

これらのいずれかを補完することもできますが、大文字以外の文字を意味するもので\P{Lu}ないため、注意してください。大文字以外の文字を意味します。

大文字または大文字の文字の場合は、を使用します [\p{Lu}\p{Lt}]。したがって、パターンに使用できます。

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

最初の文字に続く文字を「ケーシング」文字だけに制限するつもりがない場合は、次のことをお勧めします。

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

いわゆる「CamelCase」識別子と一致させようとしている場合、実際のルールはプログラミング言語によって異なりますが、通常はアンダースコア文字と10進数(\p{Nd})が含まれ、文字通りのドル記号やその他の言語も含まれる場合があります-従属文字。その場合は、これらの一部を上記の2つの文字クラスのいずれかに追加することをお勧めします。

たとえば、両方にアンダースコアを追加し、2番目の数字だけに数字を追加して、次のようにすることができます。

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

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

于 2010-10-29T13:27:42.597 に答える
46

特にWebやより「国際的な」もののために開発する場合は、tchristの答えを見てください。

Oren Trutnerの答えは完全には正しくありません(一致する必要があるが正しくない「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

/編集

解決策の鍵は、ネガティブな先読みです。参照:ゼロレングスアサーションの先読みと後読み

于 2010-10-29T13:52:29.177 に答える
13
^([A-Z][a-z]+)+$

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

于 2010-10-29T08:59:58.170 に答える
7

Unicodeに関するtchristの優れた投稿を除けば、否定的な先読みを伴う複雑なソリューションは必要ないと思います...定義には、大文字とそれに続く少なくとも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
$

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

于 2014-01-06T10:29:40.170 に答える
-15

少なくとも1つの大文字を持つMySQLのすべての従業員名を取得する場合は、次のクエリを適用します。

SELECT * FROM registration WHERE `name` REGEXP BINARY '[A-Z]';
于 2015-09-11T12:25:41.070 に答える