C#で文字列に文字のみが含まれていることを確認する


186

入力文字列があり、それが含まれていることを確認したい:

  • 文字のみまたは
  • 文字と数字のみまたは
  • 文字、数字、またはアンダースコアのみ

明確にするために、コードには3つの異なるケースがあり、それぞれ異なる検証が必要です。これをC#で実現する最も簡単な方法は何ですか?

回答:


291

文字のみ:

Regex.IsMatch(input, @"^[a-zA-Z]+$");

文字と数字のみ:

Regex.IsMatch(input, @"^[a-zA-Z0-9]+$");

文字、数字、アンダースコアのみ:

Regex.IsMatch(input, @"^[a-zA-Z0-9_]+$");

31
これは、Char.IsLetterが非ラテンアルファベットを許可するラテンアルファベットを想定しています。
ポールファンブレンク

5
Regex.IsMatch(input、 "^ [a-z0-9] + $"、RegexOptions.IgnoreCase);
トムフォベア2011年

4
@TomFobear:[a-zA-Z]を明示的に指定するよりも遅い
Philippe Leybaert

25
もう1つの検索から私のような人々を救うために、正規表現はSystem.Text.RegularExpressions名前空間にあります
Eric Barr

239
bool result = input.All(Char.IsLetter);

bool result = input.All(Char.IsLetterOrDigit);

bool result = input.All(c=>Char.IsLetterOrDigit(c) || c=='_');

5
どちらが速いのか(LINQ)またはPhilippe Leybaertのもの(正規表現)を知りたいですか?
2015

4
@nam CMU発音辞書(すべての文字のみ、平均文字数7.4文字)に対してテストを実行すると、すべての文字をコンパイルRegexするよりも1.8倍速く、オプション(!)を使用Regexしてすべての文字をコンパイルするよりも3倍速くなりIgnoreCaseます。
NetMage 2018年

受け入れられた答えはコンパイルされていない正規表現を使用しますが、それはさらに遅くなります。私はLINQソリューションを好みます。投稿してくれてありがとう:)
Berend Engelbrecht

48

文字のみ:

Regex.IsMatch(theString, @"^[\p{L}]+$");

文字と数字:

Regex.IsMatch(theString, @"^[\p{L}\p{N}]+$");

文字、数字、アンダースコア:

Regex.IsMatch(theString, @"^[\w]+$");

これらのパターンは、国際文字にも一致します(a-z構成を使用するのではなく)。


19

正規表現を使用せず、.NET 2.0フレームワーク(別名LINQなし)を使用している方のために:

文字のみ:

public static bool IsAllLetters(string s)
{
    foreach (char c in s)
    {
        if (!Char.IsLetter(c))
            return false;
    }
    return true;
}

数字のみ:

    public static bool IsAllDigits(string s)
    {
        foreach (char c in s)
        {
            if (!Char.IsDigit(c))
                return false;
        }
        return true;
    }

数字または文字のみ:

    public static bool IsAllLettersOrDigits(string s)
    {
        foreach (char c in s)
        {
            if (!Char.IsLetterOrDigit(c))
                return false;
        }
        return true;
    }

数字または文字またはアンダースコアのみ:

    public static bool IsAllLettersOrDigitsOrUnderscores(string s)
    {
        foreach (char c in s)
        {
            if (!Char.IsLetterOrDigit(c) && c != '_')
                return false;
        }
        return true;
    }

8

正規表現を使用するのは良いケースだと思います:

public bool IsAlpha(string input)
{
    return Regex.IsMatch(input, "^[a-zA-Z]+$");
}

public bool IsAlphaNumeric(string input)
{
    return Regex.IsMatch(input, "^[a-zA-Z0-9]+$");
}

public bool IsAlphaNumericWithUnderscore(string input)
{
    return Regex.IsMatch(input, "^[a-zA-Z0-9_]+$");
}

2
Regexにはこのための静的メソッドがあります
Philippe Leybaert、2009

4

文字列の文字でループし、CharメソッドIsLetterを使用して確認できますが、文字 列メソッドIndexOfAnyを使用してトリックを実行し、文字列に含まれていないと思われる他の文字を検索することもできます。


1

文字列文字を反復処理し、「IsLetter」および「IsDigit」と呼ばれる「Char」の関数を使用します。

より具体的なものが必要な場合は、Regexクラスを使用してください。


1

あなたが初心者の場合、私のコードから参照を取得できます..私がしたことは、アルファベットと空白のみを取得できるようにチェックを入れることでした!2番目のifステートメントの後にforループを繰り返して、文字列を再度検証できます。

       bool check = false;

       Console.WriteLine("Please Enter the Name");
       name=Console.ReadLine();

       for (int i = 0; i < name.Length; i++)
       {
           if (name[i]>='a' && name[i]<='z' || name[i]==' ')
           {
               check = true;
           }
           else
           {
               check = false;
               break;
           }

       }

       if (check==false)
       {
           Console.WriteLine("Enter Valid Value");
           name = Console.ReadLine();
       }

0

最近、このページを使用して、文字列内の文字をチェックする関数のパフォーマンスを改善しました。

正規表現を使用したソリューションは、Char.IsLetterOrDigitチェックを使用したソリューションよりも30倍遅いことがわかりました。

これらの文字または数字が含まれていることを確信できず、ラテン文字のみが必要だったため、Char.IsLetterOrDigit関数の逆コンパイルバージョンに基づいて関数を実装しました。

これが私たちのソリューションです:

internal static bool CheckAllowedChars(char uc)
    {
        switch (uc)
        {
            case '-':
            case '.':
            case 'A':
            case 'B':
            case 'C':
            case 'D':
            case 'E':
            case 'F':
            case 'G':
            case 'H':
            case 'I':
            case 'J':
            case 'K':
            case 'L':
            case 'M':
            case 'N':
            case 'O':
            case 'P':
            case 'Q':
            case 'R':
            case 'S':
            case 'T':
            case 'U':
            case 'V':
            case 'W':
            case 'X':
            case 'Y':
            case 'Z':
            case '0':
            case '1':
            case '2':
            case '3':
            case '4':
            case '5':
            case '6':
            case '7':
            case '8':
            case '9':
                return true;
            default:
                return false;
        }
    }

そして、使い方は次のとおりです:

 if( logicalId.All(c => CheckAllowedChars(c)))
 { // Do your stuff here.. }

0

文字が文字、数字、またはスペースであるかどうかを検証する方法を見つけてください。そうでない場合は、下線を付けてください(必要に応じて自由に変更してください)

public String CleanStringToLettersNumbers(String data)
{
    var result = String.Empty;

    foreach (var item in data)
    {
        var c = '_';

        if ((int)item >= 97 && (int)item <= 122 ||
            (int)item >= 65 && (int)item <= 90 ||
            (int)item >= 48 && (int)item <= 57 ||
            (int)item == 32)
        {
            c = item;
        }

        result = result + c;
    }

    return result;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.