2010-02-15 28 views
16

Tôi đọc một chuỗi từ bảng điều khiển. Làm cách nào để đảm bảo nó chỉ chứa các ký tự và chữ số tiếng Anh?Làm cách nào để xác minh rằng một chuỗi bằng tiếng Anh?

+14

“ký tự tiếng Anh” cho bạn (chứ chưa nói đến thực tế là kịch bản và ngôn ngữ là điều hoàn toàn khác nhau và tiếng Anh sử dụng là gì Chữ Latinh)? "Ngây thơ" là một từ tiếng Anh hoàn toàn hợp lệ, nhưng nó chứa một chữ cái không phải ASCII. Nếu tên miền của bạn thực sự là "chuỗi từ tiếng Anh" thì bạn phải cẩn thận hơn nếu bạn chỉ có nghĩa là "chuỗi chữ cái và chữ số ASCII". – Joey

+0

@Johannes Rössel điểm tốt! –

+1

Hơi ngạc nhiên rằng chín người nghĩ rằng câu hỏi này là 'hữu ích và rõ ràng' khi "chỉ chứa chữ và chữ số tiếng Anh" là rất rất mơ hồ ... – AakashM

Trả lời

26

Giả sử rằng bằng cách "ký tự tiếng Anh" bạn chỉ đơn giản là đề cập đến bảng chữ cái Latin 26 ký tự, đây sẽ là một khu vực nơi tôi sẽ sử dụng biểu thức thông thường: ^[a-zA-Z0-9 ]*$

Ví dụ:

if(Regex.IsMatch(Console.ReadLine(), "^[a-zA-Z0-9]*$")) 
{ /* your code */ } 

Lợi ích của các biểu thức chính quy trong trường hợp này là tất cả những gì bạn thực sự quan tâm là liệu chuỗi có khớp với một mẫu hay không - đây là một trong những biểu thức chính quy hoạt động tuyệt vời. Nó rõ ràng nắm bắt ý định của bạn, và nó dễ dàng mở rộng nếu bạn định nghĩa "các ký tự tiếng Anh" mở rộng ra ngoài 26 chữ cái.

Có một phong nha series of articles here dạy nhiều hơn về các cụm từ thông dụng.

Câu trả lời của Jørn Schou-Rode cung cấp giải thích tuyệt vời về cách biểu thức chính quy được trình bày tại đây hoạt động để khớp với thông tin bạn nhập.

+3

Bạn cũng có thể bao gồm khoảng trắng; "a b c" trả về false cho mẫu regex đã cho. –

+2

... và dấu chấm câu – Joe

+2

Và điều gì về các ký tự dấu chấm câu ưa thích như ký tự dấu chấm lửng (…) hoặc dấu nháy đơn? Chúng có các ký tự unicode riêng của chúng. –

12

Bạn có thể phù hợp với nó chống lại biểu thức chính quy này: ^[a-zA-Z0-9]*$

  • ^ phù hợp với sự khởi đầu của chuỗi (tức là không có nhân vật được phép trước thời điểm này)
  • [a-zA-Z0-9] trận đấu bất kỳ lá thư từ az in thường hoặc trên trường hợp, cũng như các chữ số 0-9
  • * cho phép kết quả trùng khớp trước đó bằng không hoặc nhiều lần
  • $ khớp với phần cuối của st vòng (tức là không có nhân vật được phép sau thời điểm này)

Để sử dụng các biểu hiện trong một chương trình C#, bạn sẽ cần phải nhập khẩu System.Text.RegularExpressions và làm điều gì đó như thế này trong mã của bạn:

bool match = Regex.IsMatch(input, "^[a-zA-Z0-9]*$"); 

Nếu bạn sẽ kiểm tra rất nhiều dòng chống lại các mô hình, bạn có thể muốn biên dịch biểu thức:

Regex pattern = new Regex("^[a-zA-Z0-9]*$", RegexOptions.Compiled); 

for (int i = 0; i < 1000; i++) 
{ 
    string input = Console.ReadLine(); 
    pattern.IsMatch(input); 
} 
+4

Lưu ý rằng mẫu này sẽ trả về false nếu chuỗi đầu vào chứa khoảng trắng. –

1
bool AllAscii(string str) 
{ 
    return !str.Any(c => !Char.IsLetterOrDigit(c)); 
} 
+0

Rất tốt để xác định xem chuỗi có ký tự không hợp lệ hay không ... – IAbstract

+13

IsLetterOrDigit sẽ đúng với bất kỳ ký tự Unicode nào. Không chỉ cho tiếng Anh. Tôi có đúng không? –

+0

Nó có kết quả sai theo những gì tôi kiểm tra. –

0

Something như thế này (nếu bạn muốn kiểm soát đầu vào):

static string ReadLettersAndDigits() { 
    StringBuilder sb = new StringBuilder(); 
    ConsoleKeyInfo keyInfo; 
    while ((keyInfo = Console.ReadKey(true)).Key != ConsoleKey.Enter) { 
     char c = char.ToLower(keyInfo.KeyChar); 
     if (('a' <= c && c <= 'z') || char.IsDigit(c)) { 
      sb.Append(keyInfo.KeyChar); 
      Console.Write(c); 
     } 
    } 
    return sb.ToString(); 
} 
2

bạn có quyền truy cập web không? tôi sẽ giả định rằng không thể được đảm bảo, nhưng Google có một ngôn ngữ api sẽ phát hiện ngôn ngữ bạn vượt qua nó. google language api

0

Nếu tôi không muốn sử dụng RegEx và chỉ để cung cấp giải pháp thay thế, bạn có thể kiểm tra mã ASCII của mỗi ký tự và nếu nằm trong khoảng đó, nó sẽ là một chữ cái tiếng Anh hoặc một số (Đây có thể không phải là giải pháp tốt nhất):

foreach (char ch in str.ToCharArray()) 
{ 
    int x = (int)char; 
    if (x >= 63 and x <= 126) 
    { 
     //this is english letter, i.e.- A, B, C, a, b, c... 
    } 
    else if(x >= 48 and x <= 57) 
    { 
     //this is number 
    } 
    else 
    { 
     //this is something diffrent 
    } 

} 

http://en.wikipedia.org/wiki/ASCII cho bảng ASCII đầy đủ.

Nhưng tôi vẫn nghĩ, RegEx là giải pháp tốt nhất.

+1

Câu trả lời không chính xác này nhầm lẫn ASCII với "tiếng Anh". – tchrist

0

Tôi đồng ý với câu trả lời Cụm từ thông dụng. Tuy nhiên, bạn có thể đơn giản hóa nó thành "^ [\ w] + $". \ w là bất kỳ "ký tự từ" nào (có nghĩa là [a-zA-Z_0-9] nếu bạn sử dụng bảng chữ cái không phải là unicode. Tôi cũng không biết bạn có muốn gạch dưới không. .net đây:. http://msdn.microsoft.com/en-us/library/ms972966.aspx#regexnet_topic8

0
bool onlyEnglishCharacters = !EnglishText.Any(a => a > '~'); 

vẻ rẻ, nhưng nó làm việc cho tôi, dễ trả lời legit Hy vọng nó giúp mọi người

+1

'NUL',' BEL' và các ký tự ASCII cấp thấp khác đều nhỏ hơn "~" - điều này làm cho điều này dễ vỡ hơn nhiều so với mức cần thiết.Thêm một '|| a <'0'' và bạn muốn tiến gần hơn đến giải pháp :-) –

0

Như nhiều chỉ ra, câu trả lời chấp nhận chỉ có tác dụng nếu có một từ duy nhất. trong chuỗi Vì không có câu trả lời bao gồm trường hợp nhiều từ hoặc thậm chí các câu trong chuỗi, đây là mã:

stringToCheck.Any(x=> char.IsLetter(x) && !((int)x >= 63 && (int)x <= 126)); 
1

Một cách khác là kiểm tra xem IsLower và IsUpper có trả về đúng không. Cái gì như:

private bool IsAllCharEnglish(string Input) 
    { 
     foreach (var item in Input.ToCharArray()) 
     { 
      if (!char.IsLower(item) && !char.IsUpper(item) && !char.IsDigit(item) && !char.IsWhiteSpace(item)) 
      { 
       return false; 
      } 
     } 
     return true; 
    } 

và sử dụng nó:

 string str = "فارسی abc"; 
     IsAllCharEnglish(str); // return false 
     str = "These are english 123"; 
     IsAllCharEnglish(str); // return true 
0
<?php 
    $string="हिन्दी"; 
    $string="Manvendra Rajpurohit"; 
    echo strlen($string); echo '<br>'; 
    echo mb_strlen($string, 'utf-8'); 
    echo '<br>'; 
    if(strlen($string) != mb_strlen($string, 'utf-8')) 
    { 
     echo "Please enter English words only:("; 
    } 
    else { 
     echo "OK, English Detected!"; 
    } 
?> 
+0

Hãy thử mẹo đơn giản này và tôi chắc chắn bạn sẽ thích nó .. –

Các vấn đề liên quan