2015-12-14 22 views
8

Tôi phải kiểm tra xem chuỗi có chứa chỉ chữ cái, chữ số và dấu gạch dưới hay không. Đây là cách tôi đã cố gắng nhưng nó không hoạt động:Kiểm tra xem chuỗi có chứa chỉ chữ cái, chữ số và dấu gạch dưới

for(int i = 0; i<=snameA.Length-1; i++) 
{ 
    validA = validA && (char.IsLetterOrDigit(snameA[i])||snameA[i].Equals("_")); 
} 
+2

thử sử dụng Regex để kiểm tra mẫu này: ([A-Za-z0-9 \ - \ _] +) –

+0

Tôi không biết. validA là một boolean phải được đặt đúng chỉ khi các điều kiện được thực hiện nhưng nó được đặt đúng ngay cả khi chuỗi có các ký tự đặc biệt –

+0

"Không hoạt động" là gì? lỗi? kết quả không hợp lệ? – Sayse

Trả lời

6

Tôi yêu LINQ cho các loại hình câu hỏi:

bool validA = sname.All(c => Char.IsLetterOrDigit(c) || c.Equals('_')); 
9

Bạn đang chuyển nhượng validA mỗi khi một lần nữa, mà không kiểm tra giá trị trước đó của nó. Bây giờ bạn luôn nhận được giá trị của lần kiểm tra cuối được thực hiện.

Bạn có thể 'và' kết quả:

validA &= (char.IsLetterOrDigit(snameA[i]) || snameA[i] == '_'); 

Điều này có nghĩa bạn vẫn chạy tất cả các nhân vật, mà có thể là vô ích nếu kiểm tra đầu tiên thất bại. Vì vậy, nó là tốt hơn để chỉ đơn giản là bước ra nếu nó không thành công:

for(int i = 0; i<=snameA.Length-1; i++) 
{ 
    validA = (char.IsLetterOrDigit(snameA[i]) || snameA[i] == '_'); 

    if (!validA) 
    { break; } // <-- see here 
} 

Hoặc với LINQ:

validA = snameA.All(c => char.IsLetterOrDigit(c) || c == '_'); 
+1

Tôi đã rút lại phiếu giảm giá của mình. Sử dụng regexp là một vấn đề của sự lựa chọn tôi đoán và câu trả lời của bạn là hoàn toàn chính xác quá. – Dinos

+0

Cảm ơn. Tôi không nói OP không nên sử dụng regex, nhưng bây giờ anh ta biết những gì đã sai với mã của mình. :) Cảm ơn sự trung thực của bạn. –

4

bạn có thể sử dụng regex

Regex regex1 = new Regex(@"^[a-zA-Z0-9_]+$"); 

if(regex1.IsMatch(snameA)) 
{ 

} 
+0

@PatrickHofman tôi quên một câu lệnh..thanks – Sachu

+0

'Regex' lấy ví dụ riêng của nó làm tham số! – Bharadwaj

+0

btw, 'a-zA-Z0-9_' giống với' \ w' –

2

Tôi sẽ sử dụng một Regex

string pattern = @"^[a-zA-Z0-9\_]+$"; 
Regex regex = new Regex(pattern); 

// Compare a string against the regular expression 
return regex.IsMatch(stringToTest); 
3

Bạn có thể thử khớp với biểu thức chính quy thông thường n. Có một loại được xây dựng cho "chữ cái, chữ số và dấu gạch dưới", là "\ w".

Regex rgx = new Regex(@"\w*"); 
rgs.IsMatch(yourString); 

Nếu bạn yêu cầu 1 hoặc nhiều hơn, thì hãy sử dụng "\ w +".

Thông tin thêm ở đây: Regex.IsMatch

+2

* nếu một chuỗi chứa ** chỉ ** chữ cái, chữ số và dấu gạch dưới * => Kiểm tra chính bạn nếu chuỗi chứa * bất kỳ * chữ cái, chữ số và dấu gạch dưới nào –

0

Thứ nhất, thư là một mơ hồ hạn chút: làm bạn có nghĩa là a..zA..Z ký tự hoặc thư có thể thuộc về bất kỳ bảng chữ cái nào, ví dụ: а..яА..Я (tiếng Nga, chữ Kirin). Theo số triển khai hiện tại, bạn muốn tùy chọn thứ hai thứ hai.

giải pháp điển hình với vòng lặp là để kiểm tra cho đến khi đầu tiên ví dụ truy cập:

Boolean validA = true; // true - no counter examples so far 

    // Why for? foreach is much readble here 
    foreach(Char ch in sname) 
    // "!= '_'" is more readable than "Equals"; and wants no boxing 
    if (!char.IsLetterOrDigit(ch) && ! (ch != '_')) { 
     Boolean validA = false; // counter example (i.e. non-letter/digit symbol found) 

     break; // <- do not forget this: there's no use to check other characters 
    } 

Tuy nhiên bạn có thể đơn giản hóa mã với một trong hai LINQ:

validA = sname.All(ch => Char.IsLetterOrDigit(ch) || ch == '_'); 

Hoặc biểu thức chính quy:

validA = Regex.IsMatch(sname, @"^\w*$"); 
Các vấn đề liên quan