Làm cách nào để xác thực một chuỗi để chỉ cho phép các ký tự chữ và số trong đó?


117

Làm cách nào để xác thực một chuỗi bằng Biểu thức chính quy để chỉ cho phép các ký tự chữ và số trong đó?

(Tôi cũng không muốn cho phép bất kỳ khoảng trống nào).

Câu trả lời:


181

Sử dụng biểu thức sau:

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

I E:

using System.Text.RegularExpressions;

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

Còn trong javascript thì sao, tôi đoán vậy?
mrblah

4
Nếu bạn làm sạch tên cơ sở dữ liệu hoặc một cái gì đó nội bộ tương tự, bạn sẽ không quan tâm nếu nó không chạy ở quốc gia nói tiếng Anh.
Ognyan Dimitrov

15
Tôi ghét biểu thức chính quy. Tôi biết rằng tôi sẽ không bao giờ nhớ cú pháp. Ngay cả khi tôi nghiên cứu nó, sẽ sớm có lúc tất cả lại bị lãng quên.
Sentinel

1
@Phil. Có thể, nhưng lúc đó tôi sẽ được ủy thác cho ai đó biết biểu thức thông thường ;-)
Sentinel

3
Người ta nói, "nếu bạn giải quyết một vấn đề bằng cách sử dụng biểu thức chính quy, thì bạn có hai vấn đề."
O. Jones

205

Trong .NET 4.0, bạn có thể sử dụng LINQ:

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

yourText.Allsẽ ngừng thực hiện và trả về báo cáo falselần đầu tiên vì khi đó hợp đồng không thể được thực hiện.char.IsLetterOrDigitfalseAll

Ghi chú! câu trả lời này không kiểm tra nghiêm ngặt chữ và số (thường là AZ, az và 0-9). Câu trả lời này cho phép các ký tự địa phương như åäö.

Cập nhật 2018-01-29

Cú pháp trên chỉ hoạt động khi bạn sử dụng một phương thức có một đối số duy nhất thuộc loại chính xác (trong trường hợp này char).

Để sử dụng nhiều điều kiện, bạn cần viết như sau:

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

1
Tôi sẽ ngạc nhiên nếu nó không nhanh hơn rất nhiều. Không có regex để được biên dịch hoặc đánh giá, chỉ là một phép so sánh đơn giản.
jgauffin

3
Bây giờ nó chỉ là đẹp, đơn giản và đơn giản.
Sentinel

3
Điều này sẽ không thành công nếu bạn muốn chắc chắn rằng Văn bản của bạn chắc chắn là chữ và số? Nó có thể là tất cả các chữ số hoặc tất cả các bảng chữ cái nhưng vẫn thỏa mãn điều kiện này.
itbalur

2
@itsbalur: Có, nhưng đó không phải là câu hỏi.
jgauffin 25/02/16

2
Tôi nghĩ câu trả lời này hoàn toàn sai, giả sử tập hợp chữ và số là AZ, az và 0-9 vì điều này bao gồm toàn bộ phạm vi chữ cái và chữ số Unicode, bao gồm cả các ký tự không phải La tinh. Ví dụ, char.IsLetterOrDigit('ก')sẽ trở lại true. csharppad.com/gist/f96a6062f9f8f4e974f222ce313df8ca
tia

34

Bạn có thể làm điều đó một cách dễ dàng với một hàm tiện ích mở rộng hơn là một hàm 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;
}

Mỗi nhận xét :) ...

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
Nó có thể là một vấn đề về sở thích, nhưng tôi sẽ diễn đạt vòng lặp là "foreach (char c in str) {...}". Liệu một chuỗi trống có được coi là OK hay không tùy thuộc vào ứng dụng, vì vậy tôi sẽ loại bỏ điều này. Tôi cũng sẽ không thêm 6 dòng trống vào một thói quen tầm thường như vậy, nhưng tôi đoán đó là phong cách C # / Java / C ++ - các lập trình viên dường như được trả bằng bất động sản màn hình. Dù sao đây cũng là hướng đi đúng đắn nên +1.
Svante

3
Tôi nghĩ rằng chúng tôi muốn sử dụng IsDigit trong tình huống này, chứ không phải là ISNUMBER - ISNUMBER sẽ trở lại đúng với chữ số, hoặc cho những thứ mà nhìn như số (phân số, số La Mã, vv .; thấy msdn.microsoft.com/ vi-us / library / yk2b3t2y.aspx ). Do đó, và nếu một người cảm thấy đặc biệt xấu xa, người ta có thể nén nội dung của IsAlphaNum hơn nữa: return string.IsNullOrEmpty (str)? false: str.ToCharArray (). All (Char.IsLetterOrDigit);
stack

4
Lưu ý rằng Char.IsLetter sẽ đánh giá là true cho các "chữ cái" không phải là a-zA-Z. Ví dụ, tiếng Nhật あ, tiếng Trung 的, tiếng Hàn 한, v.v. được coi là các "chữ cái" Unicode. Nếu đây là ý định của bạn, thì tốt thôi, nhưng xét từ các biểu thức regex khác nhau trong các câu trả lời khác, đây có thể không phải là thứ được coi là alpha [số] nhất.
Dono

Trong trường hợp của tôi, ngoài IsLetter và IsNumber, tôi cũng cần IsWhiteSpace vì vậy tôi đã thêm nó vào mã của bạn và nó hoạt động hoàn hảo!
Ben Junior

sử dụng char.IsLetterOrDigitthay vì IsLetter + ISNUMBER
nick_n_a

17

Trong khi tôi nghĩ rằng giải pháp dựa trên regex có lẽ là cách tôi muốn đi, tôi muốn gói gọn điều này trong một kiểu.

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;
    }
}

Bây giờ, khi bạn cần một chuỗi được xác thực, bạn có thể yêu cầu chữ ký phương thức yêu cầu một AlphaNumericString và biết rằng nếu bạn nhận được một chuỗi, thì nó là hợp lệ (ngoại trừ null). Nếu ai đó cố gắng chuyển vào một chuỗi không được xác thực, nó sẽ tạo ra lỗi trình biên dịch.

Bạn có thể lấy fancier và triển khai tất cả các toán tử bình đẳng hoặc một phép truyền rõ ràng tới AlphaNumericString từ chuỗi đơn giản, nếu bạn quan tâm.


Tôi chưa bao giờ thấy cách tiếp cận này, nhưng tôi thích sự rõ ràng của ý định và sự biện minh của bạn. +1.
Cory House

1
Đây là mới với tôi. Tôi đang cố gắng để hiểu được static public implicit operator stringmột phần
Hassan Gulzar

8

Tôi cần kiểm tra AZ, az, 0-9; không có regex (mặc dù OP yêu cầu regex).

Kết hợp các câu trả lời và nhận xét khác nhau ở đây và thảo luận từ https://stackoverflow.com/a/9975693/292060 , phần này kiểm tra chữ cái hoặc chữ số, tránh các chữ cái ngôn ngữ khác và tránh các số khác như ký tự phân số.

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

4

^\w+$ sẽ cho phép a-zA-Z0-9_

Sử dụng ^[a-zA-Z0-9]+$ để không cho phép gạch dưới.

Lưu ý rằng cả hai điều này đều yêu cầu chuỗi không được để trống. Sử dụng *thay vì +cho phép các chuỗi trống.


làm cách nào tôi có thể thay đổi ^ \ w + $ của bạn để cũng cho phép dấu gạch ngang "-"?
Neal Davis,

@NealDavis^[\w-]+$
Zachafer

2

Để kiểm tra xem chuỗi có phải là cả chữ cái và chữ số hay không, bạn có thể viết lại câu trả lời @jgauffin như sau bằng cách sử dụng .NET 4.0 và LINQ:

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

Điều này sẽ không đúng cách nhận ra chuỗi chứa ký tự khác cùng với chữ và số ...
nsimeonov

1

Câu trả lời tương tự như ở đây .

Nếu bạn muốn một ASCII không regex A-z 0-9 kiểm tra , bạn không thể sử dụng char.IsLetterOrDigit()vì nó bao gồm các ký tự Unicode khác.

Những gì bạn có thể làm là kiểm tra các dải mã ký tự.

  • 48 -> 57 là số
  • 65 -> 90 là chữ in hoa
  • 97 -> 122 là chữ thường

Sau đây là dài dòng hơn một chút, nhưng nó để dễ hiểu hơn là dành cho chơi gôn mã.

    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

Dựa trên câu trả lời của cletus, bạn có thể tạo tiện ích mở rộng mới.

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

Tôi khuyên bạn không nên phụ thuộc vào mã được tạo sẵn và xây dựng trong .NET framework, hãy thử đưa ra giải pháp mới .. đây là những gì tôi làm ..

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
Bạn có thể xin thêm một số giải thích cho mã của bạn, chỉ bán phá giá đang thường được tán thành ở đây
Draken

Ngoài ra, họ yêu cầu các biểu thức chính quy, đây không phải là biểu thức chính quy
Draken

Cảm ơn đã nhận xét và quan sát..như tôi đã khuyên tôi nên có cách tiếp cận riêng để viết mã.
Mahdi Al Aradi

5
Nhận xét của bạn về việc không dựa vào mã xây dựng trước trong .Net không có ý nghĩa gì, chắc chắn nếu bạn không dựa vào mã xây dựng trước, bạn không nên sử dụng char.IsNumber()phương pháp vì đó là mã xây dựng trước?
Draken

4
Đoạn mã này là một ví dụ tuyệt vời về lý do tại sao việc tự mình phát minh lại nó là một ý tưởng tồi - nó không thực sự làm những gì bạn muốn làm! (Chuỗi "@ 1a" sẽ trả về true không chính xác, chuỗi "a" sẽ trả về false)
Flexo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.