การตรวจสอบว่าสตริงมีเฉพาะตัวอักษรใน C #


187

ฉันมีสตริงอินพุตและฉันต้องการตรวจสอบว่ามี:

  • ตัวอักษรหรือ
  • เฉพาะตัวอักษรและตัวเลขหรือ
  • เฉพาะตัวอักษรตัวเลขหรือขีดล่าง

เพื่อชี้แจงฉันมี 3 กรณีที่แตกต่างกันในรหัสการโทรแต่ละครั้งสำหรับการตรวจสอบที่แตกต่างกัน วิธีที่ง่ายที่สุดในการบรรลุสิ่งนี้ใน C # คืออะไร?

คำตอบ:


292

ตัวอักษรเท่านั้น:

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

ตัวอักษรและตัวเลขเท่านั้น:

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

เฉพาะตัวอักษรตัวเลขและขีดล่าง:

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

31
สิ่งนี้จะถือว่าเป็นตัวอักษรละตินที่ Char.IsLetter อนุญาตให้ใช้ตัวอักษรที่ไม่ใช่ละติน
Paul van Brenk

5
Regex.IsMatch (อินพุต, "^ [a-z0-9] + $", RegexOptions.IgnoreCase);
Tom Fobear

4
@ TomFobear: นี่ช้ากว่าการระบุ [a-zA-Z] อย่างชัดเจน
Philippe Leybaert

25
เพียงเพื่อช่วยคนอย่างฉันจากการค้นหาอีกหนึ่ง Regex อยู่ใน System.Text.Regular Expressions Namespace
Eric Barr

241
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 (Regex)
nam

4
@nam ทำการทดสอบกับพจนานุกรมการออกเสียงของ CMU (ตัวอักษรทั้งหมดเท่านั้นความยาวเฉลี่ย 7.4 ตัวอักษร) ซึ่งเร็วกว่าการคอมไพล์Regexสำหรับตัวอักษรทั้งหมด1.8 เท่าและเร็วกว่าการคอมไพล์Regexด้วยIgnoreCaseตัวเลือกทั้งหมด3 เท่า!
NetMage

คำตอบที่ยอมรับนั้นใช้ Regex ที่ไม่ได้คอมไพล์ซึ่งจะช้ากว่าเดิม ฉันชอบวิธีการแก้ปัญหา LINQ ขอบคุณสำหรับการโพสต์ :)
Berend Engelbrecht

48

ตัวอักษรเท่านั้น:

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

ตัวอักษรและตัวเลข:

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

ตัวอักษรตัวเลขและขีดล่าง:

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

หมายเหตุรูปแบบเหล่านี้ยังจับคู่อักขระสากล (ต่างจากการใช้a-zโครงสร้าง)


19

สำหรับผู้ที่ไม่ต้องการไปกับ Regex และอยู่ใน. NET 2.0 Framework (AKA no 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

4

คุณสามารถวนลูปใน chars ของสตริงและตรวจสอบโดยใช้ Char Method IsLetter แต่คุณสามารถทำการหลอกลวงด้วยการใช้เมธอด String IndexOfAnyเพื่อค้นหา charaters อื่น ๆ ที่ไม่ควรอยู่ในสตริง


1

วนซ้ำผ่านตัวอักขระสตริงและใช้ฟังก์ชันของ 'Char' ที่เรียกว่า 'IsLetter' และ 'IsDigit'

หากคุณต้องการสิ่งที่เฉพาะเจาะจงมากขึ้น - ใช้คลาส Regex


1

หากคุณเป็นมือใหม่คุณสามารถอ้างอิงจากรหัสของฉัน .. สิ่งที่ฉันทำคือการใส่เช็คเพื่อที่ฉันจะได้รับตัวอักษรและช่องว่างสีขาวเท่านั้น! คุณสามารถทำซ้ำ for for loop ได้หลังจากที่สองถ้า statement เพื่อตรวจสอบความถูกต้องของสตริงอีกครั้ง

       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

เมื่อเร็ว ๆ นี้ฉันได้ทำการปรับปรุงประสิทธิภาพสำหรับฟังก์ชั่นที่ตรวจสอบตัวอักษรในสตริงด้วยความช่วยเหลือของหน้านี้

ฉันพบว่าโซลูชันที่มี regex ช้ากว่าการตรวจสอบด้วย 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.