ฉันจะตรวจสอบความถูกต้องของสตริงเพื่ออนุญาตเฉพาะอักขระที่เป็นตัวอักษรและตัวเลขในนั้นได้อย่างไร


117

ฉันจะตรวจสอบความถูกต้องของสตริงโดยใช้นิพจน์ทั่วไปเพื่ออนุญาตเฉพาะอักขระที่เป็นตัวอักษรและตัวเลขในนั้นได้อย่างไร

(ฉันไม่ต้องการให้เว้นวรรคเช่นกัน)

คำตอบ:


181

ใช้นิพจน์ต่อไปนี้:

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

เช่น:

using System.Text.RegularExpressions;

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

แล้วในจาวาสคริปต์ฉันเดาเหมือนกันไหม
mrblah

4
หากคุณล้างชื่อฐานข้อมูลหรือชื่อภายในเช่นนั้นคุณจะไม่สนใจว่ามันจะไม่ทำงานในประเทศที่ใช้ภาษาอังกฤษ
Ognyan Dimitrov

15
ฉันเกลียดการแสดงออกปกติ ฉันรู้ว่าฉันจะไม่จำไวยากรณ์ แม้ว่าฉันจะศึกษามัน แต่มันจะมาถึงในไม่ช้าเมื่อทุกอย่างถูกลืมอีกครั้ง
Sentinel

1
@Phil บางที แต่ในตอนนี้ฉันจะมอบหมายให้คนที่รู้สำนวนปกติ ;-)
Sentinel

3
มีการกล่าวว่า "ถ้าคุณแก้ปัญหาโดยใช้นิพจน์ทั่วไปแสดงว่าคุณมีปัญหา 2 ข้อ"
O. Jones

205

ใน. NET 4.0 คุณสามารถใช้ LINQ:

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

yourText.Allจะหยุดดำเนินการและส่งคืนรายงานfalseในครั้งแรกเนื่องจากไม่สามารถปฏิบัติตามสัญญาได้char.IsLetterOrDigitfalseAll

บันทึก! คำตอบนี้ไม่ได้ตรวจสอบตัวอักษรและตัวเลขอย่างเคร่งครัด (ซึ่งโดยทั่วไปคือ AZ, az และ 0-9) åäöคำตอบนี้จะช่วยให้ตัวละครในท้องถิ่นเช่น

อัพเดท 2018-01-29

ไวยากรณ์ด้านบนใช้ได้เฉพาะเมื่อคุณใช้วิธีการเดียวที่มีอาร์กิวเมนต์เดียวของประเภทที่ถูกต้อง (ในกรณีนี้char)

หากต้องการใช้หลายเงื่อนไขคุณต้องเขียนดังนี้:

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

1
ฉันจะแปลกใจถ้ามันเร็วกว่านี้ไม่มาก ไม่มี regex ที่จะรวบรวมหรือประเมินเพียงแค่เปรียบเทียบง่ายๆ
jgauffin

3
ตอนนี้เป็นเพียงความสวยงามธรรมดาและเรียบง่าย
Sentinel

3
สิ่งนี้จะไม่ล้มเหลวหากคุณต้องการให้แน่ใจว่าข้อความของคุณเป็นตัวอักษรและตัวเลขหรือไม่? อาจเป็นตัวเลขทั้งหมดหรือตัวอักษรทั้งหมด แต่ยังคงเป็นไปตามเงื่อนไขนี้
itsbalur

2
@itsbalur: ใช่ แต่นั่นไม่ใช่คำถาม
jgauffin

2
ฉันคิดว่าคำตอบนี้ผิดธรรมดาโดยสมมติว่าชุดตัวอักษรและตัวเลขคือ AZ, az และ 0-9 เนื่องจากสิ่งนี้ครอบคลุมตัวอักษรและตัวเลข Unicode ทั้งหมดซึ่งรวมถึงอักขระที่ไม่ใช่ละตินด้วย ยกตัวอย่างเช่นจะกลับมาchar.IsLetterOrDigit('ก') csharppad.com/gist/f96a6062f9f8f4e974f222ce313df8catrue
tia

34

คุณสามารถทำได้อย่างง่ายดายด้วยฟังก์ชันส่วนขยายแทนที่จะเป็น regex ...

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) {... }" การพิจารณาว่าสตริงว่างจะถือว่าตกลงหรือไม่นั้นขึ้นอยู่กับแอปพลิเคชันดังนั้นฉันจะเอาออก ฉันจะไม่เติม 6 บรรทัดว่างลงในกิจวัตรที่ไม่สำคัญเช่นนี้ แต่ฉันเดาว่านั่นคือสไตล์ C # / Java / C ++ - ดูเหมือนว่าผู้เข้ารหัสจะได้รับเงินจากอสังหาริมทรัพย์บนหน้าจอ อย่างไรก็ตามนี่คือทิศทางที่ถูกต้องดังนั้น +1
Svante

3
ฉันคิดว่าเราต้องการใช้ IsDigit ในสถานการณ์นี้แทนที่จะเป็น IsNumber - IsNumber จะคืนค่าจริงสำหรับตัวเลขหรือสำหรับสิ่งที่ดูเหมือนตัวเลข (เศษส่วนเลขโรมัน ฯลฯ ดูmsdn.microsoft.com/ en-us / library / yk2b3t2y.aspx ) ระบุว่าและถ้าใครรู้สึกชั่วร้ายเป็นพิเศษเราสามารถบีบอัดเนื้อหาของ IsAlphaNum ให้ดียิ่งขึ้น: return string.IsNullOrEmpty (str)? เท็จ: str ToCharArray () ทั้งหมด (Char.IsLetterOrDigit);
กอง

4
โปรดทราบว่า Char.IsLetter จะประเมินเป็นจริงสำหรับ "ตัวอักษร" นอกเหนือจาก a-zA-Z ตัวอย่างเช่นญี่ปุ่นあจีน的เกาหลี한เป็นต้นจะถือว่าเป็น "ตัวอักษร" แบบ Unicode หากนี่เป็นความตั้งใจของคุณก็ใช้ได้ แต่เมื่อพิจารณาจากนิพจน์ regex ต่างๆในคำตอบอื่น ๆ นี่อาจไม่ใช่สิ่งที่ถือว่าเป็นอัลฟา [ตัวเลข] มากที่สุด
Dono

ในกรณีของฉันนอกจาก IsLetter และ IsNumber ฉันยังต้องการ IsWhiteSpace ดังนั้นฉันจึงเพิ่มลงในโค้ดของคุณและมันก็ทำงานได้อย่างสมบูรณ์!
Ben Junior

ใช้char.IsLetterOrDigitแทน IsLetter + IsNumber
nick_n_a

17

ในขณะที่ฉันคิดว่าโซลูชันที่ใช้ regex น่าจะเป็นวิธีที่ฉันจะไป แต่ฉันก็ถูกล่อลวงให้ห่อหุ้มสิ่งนี้เป็นประเภท

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) หากมีคนพยายามส่งผ่านในสตริงที่ไม่ผ่านการตรวจสอบจะทำให้เกิดข้อผิดพลาดของคอมไพเลอร์

คุณสามารถเล่นตัวละครและใช้ตัวดำเนินการความเท่าเทียมกันทั้งหมดหรือใช้ตัวแสดงอย่างชัดเจนไปยัง AlphaNumericString จากสตริง ol ธรรมดาก็ได้หากคุณสนใจ


ฉันไม่เคยเห็นแนวทางนี้ แต่ฉันชอบความชัดเจนของเจตนาและเหตุผลของคุณ +1
Cory House

1
นี่เป็นเรื่องใหม่สำหรับฉัน ฉันกำลังพยายามทำความเข้าใจstatic public implicit operator stringส่วนนี้
Hassan Gulzar

8

ฉันต้องการตรวจสอบ AZ, az, 0-9; โดยไม่มีนิพจน์ทั่วไป (แม้ว่า OP จะขอ regex)

การผสมผสานคำตอบและความคิดเห็นต่างๆที่นี่และการสนทนาจาก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

ในการตรวจสอบว่าสตริงเป็นทั้งตัวอักษรและตัวเลขผสมกันหรือไม่คุณสามารถเขียนคำตอบ @jgauffin ใหม่ได้ดังนี้โดยใช้. NET 4.0 และ LINQ:

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

สิ่งนี้จะจดจำสตริงที่มีอักขระอื่นพร้อมกับตัวเลขและตัวอักษรอย่างไม่ถูกต้อง ...
nsimeonov

1

คำตอบเดียวกับที่นี่

หากคุณต้องการA-z 0-9ตรวจสอบASCII ที่ไม่ใช่ regex คุณไม่สามารถใช้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

จากคำตอบของ cletus คุณอาจสร้างส่วนขยายใหม่

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 framework ลองนำเสนอวิธีแก้ปัญหาใหม่ .. นี่คือสิ่งที่ฉันทำ ..

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

นอกจากนี้พวกเขายังขอนิพจน์ทั่วไปนี่ไม่ใช่นิพจน์ทั่วไป
Draken

ขอบคุณสำหรับความคิดเห็นและข้อสังเกต.. ฉันแนะนำว่าฉันมีแนวทางในการเขียนโค้ดของตัวเอง
Mahdi Al Aradi

5
ความคิดเห็นของคุณเกี่ยวกับการไม่พึ่งพาโค้ดก่อนสร้างใน. Net มีเหตุผลเล็กน้อยแน่นอนว่าถ้าคุณไม่ควรพึ่งพาโค้ดก่อนสร้างคุณไม่ควรใช้char.IsNumber()วิธีนี้เนื่องจากเป็นโค้ดที่สร้างไว้ล่วงหน้า?
Draken

4
โค้ดนี้เป็นตัวอย่างที่ดีว่าทำไมการสร้างนวัตกรรมใหม่ด้วยตัวคุณเองจึงเป็นความคิดที่ไม่ดี - มันไม่ได้ทำอย่างที่คุณต้องการจริงๆ! (สตริง "@ 1a" จะคืนค่าจริงอย่างไม่ถูกต้องสตริง "a" จะส่งคืนเท็จ)
Flexo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.