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.
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.
Câu trả lời:
Để 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 \w
như 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, \w
có 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.
[\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.
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+$/
\w
tươ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ế.
\w
không thường chỉ giới hạn ở ASCII.
[a-z]
và các biến thể của nó. \w
cũng sẽ chụp các nhân vật không phải là người Latin. Thích šēēā
hoặcкукареку
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*$
Ừ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*$
Mặc dù dài dòng hơn \w
như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 -P
anyway. 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.
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.
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).
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ừ".
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();
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";
}
Đ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
^ ... $
- khớp với mẫu bắt đầu và kết thúc bằng[\d]*
- khớp 0 hoặc nhiều chữ số[a-z_]
- phù hợp với một bảng chữ cái hoặc gạch dưới[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/gi
- khớp toàn cầu trên toàn chuỗi và không phân biệt chữ hoa chữ thường1234
là 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.
Đố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,})+$
Đối với những người bạn đang tìm kiếm kết hợp chữ và số unicode, bạn có thể muốn làm một cái gì đó như:
^[\p{L} \p{Nd}_]+$
Đọc thêm tại http://unicode.org/reports/tr18/ và tại http://www.THER-expressions.info/unicode.html
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!
Để 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_]+$
Đ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:
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}`);
});
}