Biểu thức chính quy cho chữ và số


585

Tôi muốn có một biểu thức chính quy kiểm tra xem một chuỗi chỉ chứa chữ hoa và chữ thường, số và dấu gạch dưới.

regex 

9
Thật đáng tiếc khi các công cụ regex khác nhau có các phương tiện khác nhau để phù hợp với chữ và số. Một câu hỏi như thế này (khá mơ hồ, không có ngôn ngữ / hương vị regex được chỉ định) đòi hỏi một câu trả lời rất dài hoặc ít nhất là có tổ chức dựa trên mỗi hương vị.
Wiktor Stribiżew

Câu trả lời:


939

Để khớp với một chuỗi chỉ chứa các ký tự đó (hoặc một chuỗi trống), hãy thử

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

Điều này hoạt động cho các biểu thức chính quy .NET và có thể rất nhiều ngôn ngữ khác.

Phá vỡ nó:

^ : start of string
[ : beginning of character group
a-z : any lowercase letter
A-Z : any uppercase letter
0-9 : any digit
_ : underscore
] : end of character group
* : zero or more of the given characters
$ : end of string

Nếu bạn không muốn cho phép các chuỗi trống, hãy sử dụng + thay vì *.


Như những người khác đã chỉ ra, một số ngôn ngữ regex có dạng tốc ký [a-zA-Z0-9_]. Trong ngôn ngữ regex .NET, bạn có thể bật hành vi ECMAScript và sử dụng \wnhư một tốc ký (mang lại ^\w*$hoặc ^\w+$). Lưu ý rằng trong các ngôn ngữ khác và theo mặc định trong .NET, \wcó phần rộng hơn và cũng sẽ phù hợp với các loại ký tự Unicode khác (cảm ơn Jan đã chỉ ra điều này). Vì vậy, nếu bạn thực sự có ý định chỉ khớp các ký tự đó, sử dụng biểu mẫu rõ ràng (dài hơn) có lẽ là tốt nhất.


8
Nếu bạn từng đến Đức hoặc nếu bạn từng thấy bất kỳ văn bản tiếng Đức nào, bạn sẽ thấy những gì tôi đang nói.
Lập trình viên Windows

30
\ w và [A-Za-z0-9_] không tương đương trong hầu hết các hương vị regex. \ w bao gồm các chữ cái có dấu phụ, các chữ cái từ các tập lệnh khác, v.v.
Jan Goyvaerts

4
Câu hỏi ban đầu đã nói "chữ in hoa và chữ thường", vì vậy có vẻ như "chữ cái" từ các chữ viết phi Latinh phải khớp.
Trejkaz

3
[\p{upper}\p{lower}\p{gc=Number}_]là tất cả những gì bạn cần để làm điều này đúng, giả sử không có nhân vật kết hợp.
tchrist

1
Có vẻ như preg_match yêu cầu mẫu của bạn phải được đính kèm với các dấu phân cách, thường là dấu gạch chéo. Vì vậy, bạn sẽ cần "/ ^ [a-zA-Z0-9 _] * $ /". Xem câu hỏi này để biết thêm thông tin: stackoverflow.com/questions/6445133/ . Xem thêm trang này: forum.phpfreaks.com/topic/ Kẻ
Charlie

346

Có rất nhiều sự dài dòng ở đây, và tôi cực kỳ chống lại nó, vì vậy, câu trả lời kết luận của tôi sẽ là:

/^\w+$/

\wtương đương với [A-Za-z0-9_], đó là khá nhiều những gì bạn muốn. (trừ khi chúng tôi giới thiệu unicode cho hỗn hợp)

Sử dụng bộ +định lượng, bạn sẽ khớp một hoặc nhiều ký tự. Nếu bạn cũng muốn chấp nhận một chuỗi trống, hãy sử dụng *thay thế.


67
\wkhông thường chỉ giới hạn ở ASCII.
tchrist

26
Tiếng Anh không phải là ngôn ngữ duy nhất trên thế giới, vì vậy đây nên là câu trả lời được chấp nhận, không phải là [a-z]và các biến thể của nó. \wcũng sẽ chụp các nhân vật không phải là người Latin. Thích šēēāhoặcкукареку
Alex

1
Được xác thực trên trang 318 của O'Reilly "Làm chủ các biểu thức chính quy"
guideotex 16/11/18

36

Bạn muốn kiểm tra xem mỗi ký tự có khớp với yêu cầu của bạn không, đó là lý do tại sao chúng tôi sử dụng:

[A-Za-z0-9_]

Và bạn thậm chí có thể sử dụng phiên bản tốc ký:

\w

Điều này là tương đương (trong một số hương vị regex, vì vậy hãy chắc chắn rằng bạn kiểm tra trước khi sử dụng nó). Sau đó, để chỉ ra rằng toàn bộ chuỗi phải khớp, bạn sử dụng:

^

Để chỉ ra chuỗi phải bắt đầu bằng ký tự đó, sau đó sử dụng

$

Để chỉ ra chuỗi phải kết thúc bằng ký tự đó. Sau đó sử dụng

\w+ or \w*

Để chỉ "1 trở lên" hoặc "0 trở lên". Đặt tất cả lại với nhau, chúng ta có:

^\w*$

10
\ w và [A-Za-z0-9_] không tương đương trong hầu hết các hương vị regex. \ w bao gồm các chữ cái có dấu phụ, các chữ cái từ các tập lệnh khác, v.v.
Jan Goyvaerts

32

Ừm ... câu hỏi: Có cần phải có ít nhất một nhân vật hay không? Nó có thể là một chuỗi rỗng?

^[A-Za-z0-9_]+$

Sẽ làm ít nhất một chữ cái viết thường hoặc viết thường hoặc gạch dưới. Nếu nó có thể có độ dài bằng 0, thì chỉ cần thay thế + cho *

^[A-Za-z0-9_]*$

Biên tập:

Nếu cần bao gồm các dấu phụ (chẳng hạn như cedilla - ç) thì bạn sẽ cần sử dụng ký tự từ giống như trên, nhưng bao gồm các ký tự dấu phụ:

^\w+$

Hoặc là

^\w*$

Bây giờ bạn đề cập đến nó, tôi cũng đã bỏ lỡ cả đống nhân vật Pháp khác ...
BenAlabaster

1
\ w giống như [\ w] với nỗ lực gõ ít hơn
Jan Goyvaerts

Vâng, bạn vẫn cần + hoặc * và ^ và $ - \ w chỉ kiểm tra xem nó có chứa các ký tự từ không, không phải nó chỉ chứa các ký tự từ ...
BenAlabaster

Thật kỳ lạ, điều này vẫn cho phép ký hiệu $.
Ấn tượng

@ Công viên, đó là vì những gì BenAlabaster đã chỉ ra
Sebas

27

Mặc dù dài dòng hơn \wnhưng cá nhân tôi đánh giá cao khả năng đọc của tên lớp ký tự POSIX đầy đủ ( http://www.zytrax.com/tech/web/regex.htmlm#special ), vì vậy tôi nói:

^[[:alnum:]_]+$

Tuy nhiên, trong khi tài liệu tại các liên kết ở trên nói rằng \w"Phù hợp với bất kỳ ký tự nào trong phạm vi 0 - 9, A - Z và a - z (tương đương với POSIX [: alnum:])", tôi không thấy điều này là đúng . Không phải với grep -Panyway. Bạn cần bao gồm rõ ràng phần gạch dưới nếu bạn sử dụng [:alnum:]nhưng không bao gồm nếu bạn sử dụng \w. Bạn không thể đánh bại những điều sau đây ngắn gọn và ngọt ngào:

^\w+$

Cùng với khả năng đọc, sử dụng các lớp ký tự POSIX ( http://www.THER-expressions.info/poseixbrackets.html ) có nghĩa là regex của bạn có thể hoạt động trên các chuỗi không phải ASCII, mà các regex dựa trên phạm vi sẽ không làm được vì chúng dựa vào thứ tự cơ bản của các ký tự ASCII có thể khác với các bộ ký tự khác và do đó sẽ loại trừ một số ký tự không phải ASCII (các chữ cái như) mà bạn có thể muốn chụp.


22

Trong Khoa học máy tính, giá trị chữ và số thường có nghĩa là ký tự đầu tiên không phải là số mà là bảng chữ cái hoặc dấu gạch dưới. Sau đó, nhân vật có thể 0-9, A-Z, a-z, hoặc dấu gạch dưới ( _).

Đây là cách bạn sẽ làm điều đó:

Đã thử nghiệm theo php:

$regex = '/^[A-Za-z_][A-Za-z\d_]*$/'

hoặc lấy cái này

^[A-Za-z_][A-Za-z\d_]*$

và đặt nó trong ngôn ngữ phát triển của bạn.


17

Làm thế nào về:

^([A-Za-z]|[0-9]|_)+$

... Nếu bạn muốn rõ ràng, hoặc:

^\w+$

... Nếu bạn thích súc tích (cú pháp Perl).


12

sử dụng lookahead để làm công cụ "ít nhất một". Tin tôi đi, nó dễ hơn nhiều.

Đây là một ví dụ yêu cầu 1-10 ký tự, chứa ít nhất một chữ số và một chữ cái:

^(?=.*\d)(?=.*[A-Za-z])[A-Za-z0-9]{1,10}$

LƯU Ý: có thể đã sử dụng \ w nhưng sau đó các cân nhắc ECMA / Unicode sẽ phát huy tác dụng làm tăng độ bao phủ ký tự của \ w "ký tự từ".


Chúng tôi sẽ làm thế nào nếu chúng tôi muốn thêm _ và - vào danh sách?
Rahi

10

Hãy thử các tiện ích mở rộng đa ngôn ngữ này mà tôi đã tạo cho chuỗi.

IsAlphaNumeric - Chuỗi phải chứa ít nhất 1 alpha (chữ cái trong phạm vi Unicode, được chỉ định trong charset) và ít nhất 1 số (được chỉ định trong numset). Ngoài ra, chuỗi chỉ bao gồm alpha và số.

IsAlpha - Chuỗi phải chứa ít nhất 1 alpha (trong ngôn ngữ charset được chỉ định) và chỉ bao gồm alpha.

IsNumeric - Chuỗi phải chứa ít nhất 1 số (trong ngôn ngữ số được chỉ định) và chỉ bao gồm các số.

Có thể chỉ định phạm vi charset / numset cho ngôn ngữ mong muốn. Phạm vi Unicode có sẵn trên liên kết dưới đây:

http://www.ssec.wisc.edu/~tomw/java/unicode.html

API:

    public static bool IsAlphaNumeric(this string stringToTest)
    {
        //English
        const string charSet = "a-zA-Z";
        const string numSet = @"0-9";

        //Greek
        //const string charSet = @"\u0388-\u03EF";            
        //const string numSet = @"0-9";

        //Bengali
        //const string charSet = @"\u0985-\u09E3";
        //const string numSet = @"\u09E6-\u09EF";

        //Hindi
        //const string charSet = @"\u0905-\u0963";
        //const string numSet = @"\u0966-\u096F";

        return Regex.Match(stringToTest, @"^(?=[" + numSet + @"]*?[" + charSet + @"]+)(?=[" + charSet + @"]*?[" + numSet + @"]+)[" + charSet + numSet +@"]+$").Success;
    }

    public static bool IsNumeric(this string stringToTest)
    {
        //English
        const string numSet = @"0-9";

        //Hindi
        //const string numSet = @"\u0966-\u096F";

        return Regex.Match(stringToTest, @"^[" + numSet + @"]+$").Success;
    }

    public static bool IsAlpha(this string stringToTest)
    {
        //English
        const string charSet = "a-zA-Z";

        return Regex.Match(stringToTest, @"^[" + charSet + @"]+$").Success;
    }

Sử dụng :

        //English
        string test = "AASD121asf";

        //Greek
        //string test = "Ϡϛβ123";

        //Bengali
        //string test = "শর৩৮";

        //Hindi
        //string test = @"क़लम३७ख़";

        bool isAlphaNum = test.IsAlphaNumeric();

@Shah: Tôi đã thêm các bảng chữ cái duy nhất (và chỉ các số nữa).
Chaianu

8

Regex sau đây khớp với các ký tự chữ và số và gạch dưới:

^[a-zA-Z0-9_]+$

Ví dụ: trong Perl:

#!/usr/bin/perl -w

my $arg1 = $ARGV[0];

# check that the string contains *only* one or more alphanumeric chars or underscores
if ($arg1 !~ /^[a-zA-Z0-9_]+$/) {
  print "Failed.\n";
} else {
    print "Success.\n";
}

Mẫu trong mã của bạn là chính xác, nhưng mẫu ở trên chỉ kiểm tra một trường hợp duy nhất.
BenAlabaster

Đó là chủ ý, mẫu mã được dự định là một cách sử dụng rõ ràng trong việc kiểm tra thực sự một chuỗi. Ngoài ra, tại sao mã có đầu và cuối của các đánh dấu dòng cũng không có trong ví dụ regex.
Jay

1
@Windows lập trình viên - vi.wikipedia.org/wiki/Alphanumeric - bảng chữ cái Latin , không phải là "bộ ký tự Latin", đó là những gì bao gồm dấu phụ, v.v ... Hoàn toàn là một vấn đề ngữ nghĩa, nhưng cá nhân tôi đi với cách sử dụng phổ biến của thuật ngữ chữ và số như AZ và 0-9.
Jay

2
ñ là một chữ cái của bảng chữ cái trong tiếng Tây Ban Nha, bao gồm cả ở Mỹ Latinh.
Lập trình viên Windows

2
"Tôi muốn có một biểu thức chính quy kiểm tra xem một chuỗi chỉ chứa các chữ cái in hoa và chữ thường, số và dấu gạch dưới" không giới hạn nó trong các chữ cái Latinh. "Regex sau đây khớp với các ký tự chữ và số và gạch dưới" không giới hạn nó trong các chữ cái Latinh. "^ [a-zA-Z0-9 _] + $" không thành công.
Lập trình viên Windows

6

Điều này sẽ làm việc trong hầu hết các trường hợp.

/^[\d]*[a-z_][a-z\d_]*$/gi

Và hầu hết ý tôi là,

abcd       True
abcd12     True
ab12cd     True
12abcd     True

1234       False


Giải trình

  1. ^ ... $ - khớp với mẫu bắt đầu và kết thúc bằng
  2. [\d]* - khớp 0 hoặc nhiều chữ số
  3. [a-z_] - phù hợp với một bảng chữ cái hoặc gạch dưới
  4. [a-z\d_]* - phù hợp với một bảng chữ cái hoặc chữ số hoặc gạch dưới
  5. /gi - khớp toàn cầu trên toàn chuỗi và không phân biệt chữ hoa chữ thường

2
Câu hỏi ban đầu không có yêu cầu rằng bức thư sẽ được trình bày.
Dmitry Kuzminov

Bạn đang nói về bức thư nào? Regex của tôi chứa một trong những câu hỏi. Bảng chữ cái, số, gạch dưới
Chinmaya Pati

đó 1234là từ từ ngôn ngữ được yêu cầu bởi tác giả. Ngôn ngữ của bạn hạn chế hơn.
Dmitry Kuzminov

4

Đối với tôi có một vấn đề là tôi muốn phân biệt giữa số alpha, số và số alpha, vì vậy để đảm bảo một chuỗi ký tự chữ và số chứa ít nhất một alpha và ít nhất một số, tôi đã sử dụng:

^([a-zA-Z_]{1,}\d{1,})+|(\d{1,}[a-zA-Z_]{1,})+$

Chính xác những gì tôi muốn ... Cảm ơn
Aniket kale 24/12/18

3

Dưới đây là biểu thức chính cho những gì bạn muốn với bộ định lượng để chỉ định ít nhất 1 ký tự và không quá 255 ký tự

[^a-zA-Z0-9 _]{1,255}


2

Tôi tin rằng bạn không lấy các ký tự Latin và Unicode trong các trận đấu của mình. Ví dụ: nếu bạn cần lấy ký tự "ã" hoặc "ü", việc sử dụng "\ w" sẽ không hiệu quả.

Thay vào đó, bạn có thể sử dụng phương pháp này:

^[A-ZÀ-Ýa-zà-ý0-9_]+$

Hy vọng nó giúp!


1

Để kiểm tra toàn bộ chuỗi và không cho phép chuỗi trống, hãy thử

^[A-Za-z0-9_]+$

1

^\w*$ sẽ làm việc cho các kết hợp dưới đây

1
123
1av
pRo
av1

Điều gì về một dòng trống. Nó cũng là một chuỗi ký tự chữ và số?
v010dya

0

cái này hiệu quả với tôi bạn có thể thử

[\\p{Alnum}_]

0

Điều này hiệu quả với tôi, đã tìm thấy điều này trong "Làm chủ các biểu thức chính quy" của O'Reilly:

/^\w+$/

Giải trình:

  • ^ khẳng định vị trí ở đầu chuỗi
    • \ w + khớp với bất kỳ ký tự từ nào (bằng [a-zA-Z0-9_])
    • "+" Quantifier - Kết hợp giữa một và không giới hạn số lần, càng nhiều lần càng tốt, trả lại khi cần (tham lam)
  • $ khẳng định vị trí ở cuối chuỗi

Xác minh bản thân:

const regex = /^\w+$/;
const str = `nut_cracker_12`;
let m;

if ((m = regex.exec(str)) !== null) {
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}

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.