import java.util.Random;import java.util.Scanner;import java.util.regex.Matcher;import java.util.regex.Pattern;/**随机验证码数字+字母的难点就是怎么用字符串的形似表现出来,因为Random只随机出数字类型的随机数,而String类型却要先行转换成StringBuffer类型,通过对字符的处理来获得数字类型的字符下标来获得字符,然后通过StringBuffer来拼接字符成为字符串,然后通过toString来获得StringBuffer的字符串输出,然后才能进行比较。*/public class Tesat3{ public static void main(String[] args) {  String str= "qwertyuiopasdfghjklzxcvbnm1234567890Q";//大写字母写不下了  Random random = new Random();  Scanner scanner = new Scanner(System.in);  boolean b = true;  boolean c = true;  while (b)//控制循环  {   c = true;   StringBuffer sb = new StringBuffer();   for (int i = 0; i < 4; i++)//随机获取四个String类型str的字符   {    int number = random.nextInt(str.length());//随机一个str的长度位置数字下标    sb.append(str.charAt(number));//接收随机位置上的字符   }   //另外一种思路是char类型的字符可以用数字表示,ascii表有字母表对应的数字,通过随机这些   //数字来表示字母,也可以生成字母数字混合验证码   String str3 = sb.toString();//接收sb的字符串   System.out.println(sb);   System.out.println("请输入验证码");   int num = 0;   while (c)//控制循环   {    num++;    // System.out.println(num);//计算输入次数    String str2 = scanner.next();    Pattern compile = Pattern.compile("[a-zA-Z_0-9]{4}");    Matcher matcher = compile.matcher(str2);//进行字符合法性比较    boolean matches = matcher.matches();    if (matches)    {     // System.out.println("1"+matches);     //忽略大小写的比较str.equalsIgnoreCase(str3)     boolean equalsIgnoreCase = str2.equalsIgnoreCase(str3);           if (equalsIgnoreCase)     {      b = false;      System.out.println("验证码输入正确");      break;     }    } else if (num > 2)//判断输入次数    {     System.out.println("错误次数达到3次!");     c = false;//跳出该循环    }    System.out.println("输入错误!剩余次数: " + (3 - num));   }  } }}