文字列を検証して、英数字のみを許可するにはどうすればよいですか?


117

正規表現を使用して文字列を検証し、英数字のみを許可するにはどうすればよいですか?

(スペースも入れたくありません)。

回答:


181

次の式を使用します。

^[a-zA-Z0-9]*$

つまり:

using System.Text.RegularExpressions;

Regex r = new Regex("^[a-zA-Z0-9]*$");
if (r.IsMatch(SomeString)) {
  ...
}

javascriptでは、私が推測するのと同じことはどうですか?
mrblah 2009年

4
データベース名またはそのような内部のものをサニタイズする場合、英語圏の国で実行されなくてもかまいません。
Ognyan Dimitrov 2014

15
正規表現は嫌いです。構文は決して覚えないでしょう。勉強しても、すぐにすべて忘れられる時が来るでしょう。
Sentinel

1
@フィル。多分、それでも私は正規表現を知っている誰かに委任するでしょう;-)
Sentinel

3
「正規表現を使用して問題を解決する場合、2つの問題がある」と言われています。
O.ジョーンズ、

205

.NET 4.0では、LINQを使用できます。

if (yourText.All(char.IsLetterOrDigit))
{
    //just letters and digits.
}

yourText.Allの契約は実行できないため、実行が停止されfalse、最初のchar.IsLetterOrDigitレポートが返されます。falseAll

注意!この回答では、英数字(通常はAZ、az、0-9)を厳密にチェックしません。この回答では、などのローカル文字を使用できますåäö

2018-01-29の更新

上記の構文は、正しいタイプの引数が1つある(この場合はchar)1つのメソッドを使用する場合にのみ機能します。

複数の条件を使用するには、次のように記述する必要があります。

if (yourText.All(x => char.IsLetterOrDigit(x) || char.IsWhiteSpace(x)))
{
}

1
それほど速くなければ私は驚きます。コンパイルまたは評価される正規表現はなく、単純な比較です。
jgauffin 2014年

3
これで、美しく、わかりやすく、シンプルになりました。
Sentinel

3
yourTextが確実に英数字であることを確認したい場合、これは失敗しませんか?すべての数字またはすべてのアルファベットのいずれかである可能性がありますが、それでもこの条件を満たすことができます。
itsbalur 2015年

2
@itsbalur:はい、しかしそれは問題ではありませんでした。
jgauffin 2016

2
英数字セットがAZ、azおよび0-9であると仮定すると、この回答はまったく間違っていると思います。これは、非ラテン文字も含めて、Unicodeの文字と数字の全範囲をカバーするためです。たとえば、char.IsLetterOrDigit('ก')が返されtrueます。csharppad.com/gist/f96a6062f9f8f4e974f222ce313df8ca
tia

34

あなたは正規表現ではなく拡張機能を使ってそれを簡単に行うことができます...

public static bool IsAlphaNum(this string str)
{
    if (string.IsNullOrEmpty(str))
        return false;

    for (int i = 0; i < str.Length; i++)
    {
        if (!(char.IsLetter(str[i])) && (!(char.IsNumber(str[i]))))
            return false;
    }

    return true;
}

コメントごと:) ...

public static bool IsAlphaNum(this string str)
{
    if (string.IsNullOrEmpty(str))
        return false;

    return (str.ToCharArray().All(c => Char.IsLetter(c) || Char.IsNumber(c)));
}

2
好みの問題かもしれませんが、ループを「foreach(char c in str){...}」と表現します。空の文字列をOKと見なすかどうかはアプリケーションに依存するので、これを取り上げます。また、6行の空行をこのような些細なルーチンに埋め込むこともしませんが、それはC#/ Java / C ++スタイルだと思います。コーダーは画面の領域で支払われるようです。とにかく、これは正しい方向なので、+ 1。
Svante、

3
この状況では、IsNumberではなくIsDigitを使用したいと思います。IsNumberは、数字、または数値のように見えるもの(分数、ローマ数字など)に対してtrueを返します。msdn.microsoft.com/を参照してください。 en-us / library / yk2b3t2y.aspx)。それを考えると、特に悪を感じている場合は、IsAlphaNumの内容をさらに圧縮できます。return string.IsNullOrEmpty(str)?false:str.ToCharArray()。All(Char.IsLetterOrDigit);
スタック

4
Char.IsLetterは、a-zA-Z以外の「文字」に対してtrueと評価されることに注意してください。たとえば、日本語のあ、中国語、韓国語の한などは、Unicodeの「文字」と見なされます。これがあなたの意図であるならば、それで結構ですが、他の回答のさまざまな正規表現から判断すると、これはおそらく英数字であると最も考えられているものではありません。
土野

私の場合、IsLetterとIsNumberの他に、IsWhiteSpaceも必要だったので、コードに追加して完全に機能しました。
Ben Junior

char.IsLetterOrDigit代わりにIsLetter + IsNumberを使用してください
nick_n_a 2018年

17

正規表現ベースのソリューションはおそらく私が行く方法だと思いますが、これを型にカプセル化したくなります。

public class AlphaNumericString
{
    public AlphaNumericString(string s)
    {
        Regex r = new Regex("^[a-zA-Z0-9]*$");
        if (r.IsMatch(s))
        {
            value = s;                
        }
        else
        {
            throw new ArgumentException("Only alphanumeric characters may be used");
        }
    }

    private string value;
    static public implicit operator string(AlphaNumericString s)
    {
        return s.value;
    }
}

これで、検証された文字列が必要なときに、メソッドのシグネチャにAlphaNumericStringを要求させることができます。取得した場合、それは有効です(nullを除く)。検証されていない文字列を渡そうとすると、コンパイラエラーが発生します。

気になる場合は、より洗練されたすべての等価演算子を実装するか、プレーンなol '文字列からAlphaNumericStringへの明示的なキャストを行うことができます。


私はこのアプローチを見たことがありませんが、意図の明確さとあなたの正当化が好きです。+1。
Cory House

1
これは私にとって初めてです。私はそのstatic public implicit operator string部分を理解しようとしています
Hassan Gulzar

8

AZ、az、0-9を確認する必要がありました。正規表現なし(OPが正規表現を要求する場合でも)。

ここでさまざまな回答とコメントをブレンドし、https://stackoverflow.com/a/9975693/292060からのディスカッションで、これは文字または数字をテストし、他の言語の文字を避け、分数文字などの他の数字を避けます。

if (!String.IsNullOrEmpty(testString)
    && testString.All(c => Char.IsLetterOrDigit(c) && (c < 128)))
{
    // Alphanumeric.
}

4

^\w+$ できるようになります a-zA-Z0-9_

^[a-zA-Z0-9]+$アンダースコアを禁止するために使用します。

これらの両方が空でない文字列を必要とすることに注意してください。の*代わりに使用すると+、空の文字列が許可されます。


「-」ダッシュ文字も許可するように^ \ w + $を変更するにはどうすればよいですか?
Neal Davis

@NealDavis^[\w-]+$
Zachafer

2

文字列が文字と数字の組み合わせであるかどうかを確認するには、.NET 4.0とLINQを使用して、@ jgauffinの回答を次のように書き換えます。

if(!string.IsNullOrWhiteSpace(yourText) && 
yourText.Any(char.IsLetter) && yourText.Any(char.IsDigit))
{
   // do something here
}

これは、英数字とともに他の文字を含む文字列を誤って認識します...
nsimeonov

1

ここと同じ答え。

非正規表現のASCII A-z 0-9チェックが必要な場合char.IsLetterOrDigit()は、他のUnicode文字が含まれているため使用できません。

できることは、文字コードの範囲を確認することです。

  • 48-> 57は数値です
  • 65-> 90は大文字
  • 97-> 122は小文字です

以下は少し冗長ですが、コードゴルフではなく理解を容易にするためのものです。

    public static bool IsAsciiAlphaNumeric(this string str)
    {
        if (string.IsNullOrEmpty(str))
        {
            return false;
        }

        for (int i = 0; i < str.Length; i++)
        {
            if (str[i] < 48) // Numeric are 48 -> 57
            {
                return false;
            }

            if (str[i] > 57 && str[i] < 65) // Capitals are 65 -> 90
            {
                return false;
            }

            if (str[i] > 90 && str[i] < 97) // Lowers are 97 -> 122
            {
                return false;
            }

            if (str[i] > 122)
            {
                return false;
            }
        }

        return true;
    }

0

クレタスの回答に基づいて、新しい拡張子を作成できます。

public static class StringExtensions
{        
    public static bool IsAlphaNumeric(this string str)
    {
        if (string.IsNullOrEmpty(str))
            return false;

        Regex r = new Regex("^[a-zA-Z0-9]*$");
        return r.IsMatch(str);
    }
}

-8

.NETフレームワークの既製のコードや組み込みのコードに依存しないことをお勧めします。新しいソリューションを作成してみてください。これが私がしていることです。

public  bool isAlphaNumeric(string N)
{
    bool YesNumeric = false;
    bool YesAlpha = false;
    bool BothStatus = false;


    for (int i = 0; i < N.Length; i++)
    {
        if (char.IsLetter(N[i]) )
            YesAlpha=true;

        if (char.IsNumber(N[i]))
            YesNumeric = true;
    }

    if (YesAlpha==true && YesNumeric==true)
    {
        BothStatus = true;
    }
    else
    {
        BothStatus = false;
    }
    return BothStatus;
}

2
あなたのコードにいくつかの説明を追加してください、単にコードをダンプすることはここでは一般的に嫌われています
Draken

また、正規表現を求めましたが、これは正規表現ではありません
ドラケン

コメントと観察に感謝します。私が助言したように、私はコードを書くための独自のアプローチを持っています。
Mahdi Al Aradi 2016年

5
.Netの事前ビルドコードに依存しないことについてのあなたのコメントはほとんど意味がありません、確かに事前ビルドコードに依存するべきでないならchar.IsNumber()、それは事前ビルドされたコードなのでメソッドを使用すべきではありませんか?
Draken、2016年

4
このコードは、なぜ自分で再発明することが悪い考えであるかを示す良い例です。実際には、意図したことを実行していないのです。(文字列 "@ 1a"は誤ってtrueを返し、文字列 "a"はfalseを返します)
Flexo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.