web-dev-qa-db-ja.com

文字列に英字[a-z]または[A-Z]のみが含まれていることを確認するために正規表現を取得するにはどうすればよいですか?

正規表現を作成して、特定の文字列に英字a〜zまたはA〜Zしかないことを確認しようとしています。文字列の長さは最大25文字です。 (正規表現が文字列の長さをチェックできるかどうかはわかりません)

例:
1。 _"abcdef" = true;_
2。 _"a2bdef" = false_;
_"333" = false;_
4。 _"j" = true;_
5。 _"aaaaaaaaaaaaaaaaaaaaaaaaaa" = false;_ // 26文字

これが私がこれまでに持っているものです...しかしそれの何が悪いのか理解できません

Regex alphaPattern = new Regex("[^a-z]|[^A-Z]");

これは、文字列にa〜zの大文字または小文字しか含めることができないことを意味すると思いますが、すべての文字を含む文字列と一致させると、falseが返されます...

また、正規表現と他の検証方法の使用効率に関する提案をいただければ幸いです。

17
Matt
Regex lettersOnly = new Regex("^[a-zA-Z]{1,25}$");
  • ^は、「文字列の開始時に照合を開始する」ことを意味します
  • [a-zA-Z]は、「小文字と大文字のa〜zを一致させる」ことを意味します
  • {1,25}は、「前のアイテム(文字クラス、上記を参照)に1〜25回一致する」ことを意味します
  • $は、「カーソルが文字列の末尾にある場合にのみ一致する」ことを意味します
38
Blixt

特定の文字列に英字a〜zまたはA〜Zしかないことを確認するために正規表現を作成しようとしています。

他の多くが「文字クラス」として知られているものを使用して示しているように、簡単に実行できます。基本的に、これらにより、マッチングに使用する値の範囲を指定できます(注:簡略化のために、この投稿の後半で説明する暗黙の^および$アンカーを想定しています)

[a-z]任意の1つの小文字に一致します。
例:一致、8は一致しない

[A-Z]任意の1つの大文字に一致します。
例:一致する、一致しない

[0-9]任意の1桁の0から9に一致します
例:8一致、aが一致しない

[aeiou]aまたはeまたはiまたはoまたはuにのみ一致します。例:oは一致し、zは一致しません

[a-zA-Z]任意の単一の小文字に一致OR大文字。例:Aが一致、一致、3が一致しない

これらは当然、否定することもできます:[^ az]小文字以外のものに一致します例:5一致、A一致、 aが一致しません

[^ A-Z]大文字以外のものに一致します例:5一致、Aが一致しない、一致

[^ 0-9]数字以外のものに一致する例:5が一致しない、Aが一致する、一致する

[^ Aa69]Aまたはaまたは6または9でない限り、何でも一致します。例:5一致、A一致なし、aなし一致しない、3つの一致

一般的な文字クラスを確認するには、次のURLにアクセスしてください。 http://www.regular-expressions.info/reference.html

文字列の長さは最大25文字です。 (正規表現が文字列の長さをチェックできるかどうかはわかりません)

「長さ」は絶対に確認できますが、想像する方法では確認できません。 {}を使用して厳密に言えば長さではなく、繰り返しを測定します。

a {2}2つのaを一致させます。
例:aが一致しない、aaが一致する、acaが一致しない

4 {3}3つの4を一致させます。例:4が一致しない、44が一致しない、444が一致する、4434が一致しない

繰り返しには、下限と上限を設定できる値があります。

a {2、}2つ以上のaを一緒に一致させます。例:aが一致しない、aaが一致する、aaaが一致する、abaが一致しない、aaaaaaaaaが一致する

a {2,5}2つから5つのaを一緒に一致させます。例:aが一致しない、aaが一致する、aaaが一致する、abaが一致しない、aaaaaaaaaが一致しない

繰り返しは文字クラスにまで及ぶため、[a-z] {5}任意の5つの小文字を一致させます。例:bubbaが一致する、Bubbaが一致しない、BUBBAが一致しない、asdjoが一致する

[A-Z] {2,5}2〜5個の大文字を一致させます。例:bubbaが一致しない、Bubbaが一致しない、BUBBAが一致する、BUBBETTEが一致しない

[0-9] {4,8}4から8の数字を一致させます。例:bubbaが一致しない、15835が一致する、44が一致しない、3456876353456が一致しない

[a3g] {2}aに一致OR 3 OR g ifそれらは一緒に2回表示されます。例:aaが一致する、baが一致しない、33が一致する、38が一致しない、a3が一致しない

正規表現を見てみましょう:[^ az] | [^ AZ]翻訳:小文字でない限り、何にでも一致しますOR大文字。

ニーズに合うように修正するには、次のように書き直します。ステップ1:否定を削除する[az] | [AZ]翻訳:検索任意の小文字OR大文字。

ステップ2:厳密には必要ありませんが、ORロジックを少し[a-zA-Z])クリーンアップしましょう翻訳:小文字を検索OR大文字。上記と同じですが、[]のセットを1つだけ使用します。

ステップ3:「長さ」を示しましょう[a-zA-Z] {1,25}翻訳:小文字を検索OR大文字が1〜25回繰り返されました。

これは物事がファンキーになるところです。ここで完了したと思うかもしれませんし、使用しているテクノロジーに依存しているかもしれません。

厳密に言えば、正規表現[a-zA-Z] {1,25}は、1文字から25文字の大文字または小文字に一致します[〜#〜]どこでも[〜#〜]行:

[a-zA-Z] {1,25}一致、aZgD一致、BUBBA一致、243242hello242552 [〜#〜]一致[〜#〜]

実際、これまでに示したすべての例で同じことができます。それがあなたが望むものであるならば、あなたは良い状態ですが、あなたの質問に基づいて、私はあなたが行全体で1から25の大文字または小文字だけが欲しいと思います。そのために、私たちはアンカーに目を向けます。アンカーを使用すると、これらの厄介な詳細を指定できます。

^行頭
(以前はこれを否定に使用しただけなので、始めないでください)

$行末

次のように使用できます。

^ a {3}行の先頭から3回一致します例:aaa一致、123aaa一致なし、aaa123一致

a {3} $行の終わりで3回一致する例:aaa一致、123aaa一致、aaa123一致しない

^ a {3} $[〜#〜]全体[〜#〜]行を3回一致させます例:aaaが一致する、123aaaが一致しない、aaa123が一致しない

技術的に言えば、行の最初と最後に3つのaがあるため、aaaはすべての場合に一致することに注意してください。

したがって、1行で「最大5文字の長さ」の「単語」を見つけるための、技術的に正しい最終的な解決策は次のようになります。

^ [a-zA-Z] {1,25} $

ファンキーな部分は、一部のテクノロジーが暗黙的に正規表現にアンカーを配置することと、そうでないことです。正規表現をテストするか、ドキュメントを読んで、暗黙のアンカーがあるかどうかを確認する必要があります。

19
zainnab
/// <summary>
/// Checks if string contains only letters a-z and A-Z and should not be more than 25 characters in length
/// </summary>
/// <param name="value">String to be matched</param>
/// <returns>True if matches, false otherwise</returns>
public static bool IsValidString(string value)
{
    string pattern = @"^[a-zA-Z]{1,25}$";
    return Regex.IsMatch(value, pattern);
}
7
Rashmi Pandit

文字列の長さは最大25文字です。 (正規表現が文字列の長さをチェックできるかどうかはわかりません)

他の人が投稿した回答からわかるように、正規表現は文字列の長さを慎重にチェックできます。

ただし、ユーザー入力(ユーザー名など)を検証する場合は、個別にチェックすることをお勧めします。

問題は、正規表現は文字列がそれに一致するかどうかしか教えてくれないということです。なぜ一致しなかったのかはわかりません。テキストが長すぎるか、許可されていない文字が含まれていましたか?わかりません。プログラムが「提供されたユーザー名に無効な文字が含まれているか、長すぎた」と言った場合、それは友好的とはほど遠いものです。代わりに、状況ごとに個別のエラーメッセージを提供する必要があります。

6
Rene Saarsoo

使用している正規表現は、[^a-z][^A-Z]の交互です。また、式[^…]は、文字セットで説明されている文字以外の文字と一致することを意味します。

したがって、全体として、式はa-z以外の任意の1文字またはA-Z以外の任意の1文字に一致することを意味します。

ただし、a-zA-Zのみに一致する正規表現が必要です。

[a-zA-Z]

そして、その長さを指定するには、式を文字列の開始(^)と終了($)で固定し、長さを{n,m}数量詞、少なくともnを意味しますが、そうではありません以上m繰り返し:

^[a-zA-Z]{0,25}$
4
Gumbo

どちらか大文字または小文字しか含めることができないことを正しく理解していますか?

new Regex("^([a-z]{1,25}|[A-Z]{1,25})$")

この場合、正規表現を使用するのが正しいようです。

ちなみに、キャラクタークラス内のそもそもキャレット(「^」)は「ない」という意味なので、「[^a-z]|[^A-Z] "は、「小文字または大文字ではない」を意味します(a〜zがすべての文字ではないことを無視します)。

1
Svante

正規表現を開発およびテストするための優れたインタラクティブツールがあります。

式が期待どおりに機能するかどうかがすぐにわかり、ステップスルーしてデバッグすることもできるため、非常に役立ちます。

1
Jonathan Webb