次の場合の正規表現を知りたい:
文字列にはアルファベットのみを含める必要があります。大文字で始まり、その後に小文字が続く必要があります。次に、小文字または大文字にすることができます。
^[A-Z][a-z][A-Za-z]*$
ただし、文字列には連続する大文字を含めることはできません。そのロジックを正規表現に追加するにはどうすればよいですか?
つまり、HttpHandler
正しいですが、HTTPHandler
間違っています。
次の場合の正規表現を知りたい:
文字列にはアルファベットのみを含める必要があります。大文字で始まり、その後に小文字が続く必要があります。次に、小文字または大文字にすることができます。
^[A-Z][a-z][A-Za-z]*$
ただし、文字列には連続する大文字を含めることはできません。そのロジックを正規表現に追加するにはどうすればよいですか?
つまり、HttpHandler
正しいですが、HTTPHandler
間違っています。
[A-Z]
書き込みまたはを行うときはいつでも[a-z]
、1960年代の7ビットASCIIデータのみを処理することを明示的に約束します。それが本当に大丈夫なら、それなら大丈夫です。ただし、問題がない場合は、最新の文字データの処理に役立つUnicode文字プロパティが存在します。
Unicodeには2つではなく、3つのケースがあります。さらに、大文字と小文字を区別しない文字もあります。一般に文字は\pL
プロパティによって指定され、これらのそれぞれも5つのサブカテゴリの1つに正確に属します。
\p{Lu}
、 ;で指定 例:AÇDZÞΣSSίΙST\p{Lt}
;で指定 例:LjDzSsᾨSt(実際Ss
にはSt
大文字と小文字ですが、それぞれßとſtのタイトルケースを要求すると得られます)\p{Ll}
、 ;で指定 例:aαçdzςσþßᾡſt\p{Lm}
;で指定 例:ʰʲᴴᴭʺˈˠᵠꜞ\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]
アイデアでうまくいくことができます。それが実際に存在しない場合、その制限を課すことは親切ではありません。
特に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
/編集
解決策の鍵は、ネガティブな先読みです。参照:ゼロレングスアサーションの先読みと後読み
^([A-Z][a-z]+)+$
これは、大文字とそれに続く1つ以上の小文字のシーケンスを検索します。一度に許可されるのは1つだけであるため、連続する大文字は一致しません。その後に小文字を続ける必要があります。
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
$
もう少しコンパクトで読みやすいと思います...
少なくとも1つの大文字を持つMySQLのすべての従業員名を取得する場合は、次のクエリを適用します。
SELECT * FROM registration WHERE `name` REGEXP BINARY '[A-Z]';