A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

写一个正则表达式,可以匹配尾号5连的手机号。规则: 第1位是1,第二位可以是数字3458其中之一,后面4位任意数字,最后5位为任意相同的数字。

例如:18601088888、13912366666

3 个回复

倒序浏览
这不是测试题吗???
  1. package com.itheima;
  2. public class Test5 {
  3.         public static void main(String args[])
  4.         {
  5.                 //获取输入值
  6.                 String mobile="13912366766";
  7.                 //把字符串转换成字符数组
  8.                 char[] array=mobile.toCharArray();
  9.                 //数字或者字母判断开关
  10.                 boolean excheng=true;
  11.                 //判断输入的是否全为数字
  12.                 for(int i=0;i<=array.length-1;i++)
  13.                 {
  14.                         switch(array[i])
  15.                         {
  16.                         case '0':
  17.                                 break;
  18.                         case '1':
  19.                                 break;
  20.                         case '2':
  21.                                 break;
  22.                         case '3':
  23.                                 break;
  24.                         case '4':
  25.                                 break;
  26.                         case '5':
  27.                                 break;
  28.                         case '6':
  29.                                 break;
  30.                         case '7':
  31.                                 break;
  32.                         case '8':
  33.                                 break;
  34.                         case '9':
  35.                                 break;
  36.                         default:
  37.                                 System.out.println("请输入数字");
  38.                                 excheng=false;
  39.                         }
  40.                 }
  41.                 //判断是否有11位
  42.                 if(mobile.length()==11&&excheng==true)
  43.                 {
  44.                         //判断第一位是否为1
  45.                         if(array[0]=='1')
  46.                         {
  47.                                 //取出第二位值,并判断是否为3458中的其中一个
  48.                                 int secondly=array[1];
  49.                                 switch(secondly)
  50.                                 {
  51.                                 case '3':
  52.                                         //判断后五位是否相等
  53.                                         Five(array);
  54.                                         break;
  55.                                 case '4':
  56.                                         Five(array);
  57.                                         break;
  58.                                 case '5':
  59.                                         Five(array);
  60.                                         break;
  61.                                 case '8':
  62.                                         Five(array);
  63.                                         break;
  64.                                 default:
  65.                                 System.out.print("输入有误3");               
  66.                                 }
  67.                         }else
  68.                         {
  69.                                 System.out.println("输人错误2");
  70.                         }
  71.                        
  72.                 }else
  73.                 {
  74.                         System.out.println("输人错误1");
  75.                 }
  76.         }
  77.         public static void Five(char[] array)
  78.         {
  79.                 //判断开关
  80.                 boolean excheng=true;
  81.                 //取出后五位进行比较
  82.                 for(int i=array.length-1;i>=array.length-5;i--)
  83.                 {
  84.                         if(array[array.length-1]!=array[i])
  85.                         {
  86.                                 System.out.println("这不是尾号5连的手机");
  87.                                 excheng=false;
  88.                                 //continue;//结束当次循环
  89.                                 //结束循环
  90.                                 break;
  91.                         }
  92.                 }
  93.                 //当excheng==true时自行
  94.                 if(excheng)
  95.                 {
  96.                         System.out.println("这是尾号5连的手机");
  97.                 }
  98.         }
  99. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 卢宝辉 于 2014-5-27 14:21 编辑

System.out.println("18601088888".matches("1[3458]\\d{1,4}(0{5}|1{5}|2{5}|3{5}|4{5}|5{5}|6{5}|7{5}|8{5}|9{5})"));            
System.out.println("18601088888".matches("1[3458]\\d{1,4}(\\d)\\1{4}"));     

能想到的就这两个,有更简单的可以交流一下!
回复 使用道具 举报
不知道LZ是正则表达式不会写(应该是这里)还是不会用java解析正则表达式?下面我们依次解决上面的两个问题:
1.正则表达式也是一个字符串,这个题的正则表达式应该是:"1[3458]\\d{4}(\\d)\\1{4}"。以1开头,所以第一个字符为1;第2位为3458中的任意一个,在正则表达式中有一类字符称为“多种字符”,它又包括一个子类叫做自定义多种字符,[3458]就是一个自定义多种字符(还有其它类型,LZ可以自己查资料),它的意思是此处可以为3、4、5、8中的任意一个;后四个为任意数字,这里就用到了上面所讲的多种字符的另一个子类,系统定义多种字符,其中\d表示任意一个数字(0-9),后{4}表示把\d重复4遍,当然你也可以不写{4}而直接写4遍\d,至于\d前还有一个\是因为如果不写,会使用java认为是转义字符,报错;后五位为任意的相同的数字,此处的实现方法,就是先确定一个,也就是(\d),\1的意思把前面字符串出现第一个括号内容重复一次,后面加{4}说明把\1重复4次,与前面一样,这样就可以完成后5位相同的匹配了。
2.Java利用正则表达式进行匹配拥有多种方法,最常用的一种就是通过Pattern,Matcher匹配,具体看代码:
  1.         Pattern p = Pattern.compile(regEx);//调用Pattern静态方法对正则表达式进行编译,得到对象
  2.                 Matcher m = p.matcher(phoneNumber);//调用matcher方法,获取Matcher匹配对象
  3.                 boolean b = m.matches();//调用matches方法验证是否匹配
复制代码


我做此题的完整代码如下:
  1. package com.itheima;

  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;
  5. import java.util.regex.Matcher;
  6. import java.util.regex.Pattern;

  7. /**
  8. * 第5题:写一个正则表达式,可以匹配尾号5连的手机号。 规则: 第1位是1,第二位可以是数字3458其中之一,后面4位任意数字,最后5位为任意相同的数字。例如:18601088888、13912366666
  9. *
  10. * 解   析:此题关键点在于两点:一是最关键的正则表达式构建;二是正则表达式的解析,很显然要封装成函数,返回值为boolean类型。
  11. *
  12. * 扩   展:与用户交互,需要用户输入手机号然后匹配,直到用户输入ok。
  13. *
  14. * @author Tad http://weibo.com/weinabanta
  15. */
  16. public class Test5 {

  17.         public static void main(String[] args) throws IOException {
  18.                 //构造5号正则表达式
  19.                 String numRegEx = "1[3458]\\d{4}(\\d)\\1{4}";
  20.                 //获取用户输入手机号
  21.                 String phoneNumber = getPhoneNumber();
  22.                 //直到用户输入ok结果
  23.                 while (!phoneNumber.equals("ok")) {
  24.                         //根据正则表达式匹配手机号
  25.                         boolean result = isMatched(numRegEx, phoneNumber);
  26.                         //根据匹配结果输出相关信息
  27.                         printResult(result);
  28.                         //再次获取手机号
  29.                         phoneNumber = getPhoneNumber();
  30.                 }
  31.                 System.out.println("程序结束!");
  32.         }

  33.         /**
  34.          * @param numRegEx 正则表达式表示的特定手机号格式
  35.          * @param phoneNumber 需要匹配的手机号
  36.          * @return 匹配结果
  37.          */
  38.         private static boolean isMatched(String numRegEx, String phoneNumber) {
  39.                 Pattern p = Pattern.compile(numRegEx);
  40.                 Matcher m = p.matcher(phoneNumber);
  41.                 return m.matches();
  42.         }
  43.        
  44.         /**
  45.          * @return 返回用户输入的字符串
  46.          * @throws IOException
  47.          */
  48.         private static String getPhoneNumber() throws IOException{
  49.                 System.out.print("输入匹配手机号:");
  50.                 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  51.                 return br.readLine();
  52.         }
  53.        
  54.         /**
  55.          * @param result 匹配结果
  56.          */
  57.         private static void printResult(boolean result) {
  58.                 if (result == true) {
  59.                         System.out.println("匹配5连号正确");
  60.                 } else {
  61.                         System.out.println("匹配5连号错误");
  62.                 }
  63.         }
  64. }
复制代码
回复 使用道具 举报 1 0
您需要登录后才可以回帖 登录 | 加入黑马